diff --git a/spyde/actions/lifecycle.py b/spyde/actions/lifecycle.py index e9ca8e89..e6b8d241 100644 --- a/spyde/actions/lifecycle.py +++ b/spyde/actions/lifecycle.py @@ -314,9 +314,18 @@ def show_tree_node(plot, tree, new_signal) -> None: log.debug("re-emitting signal tree after transform failed: %s", e) -def paint_signal_plots(tree, data, *, levels: tuple[float, float] | None = None) -> None: +def paint_signal_plots(tree, data, *, levels: tuple[float, float] | None = None) -> int: """Paint *data* onto every signal plot of *tree*. With *levels* the plot's - contrast is locked to that range; otherwise it re-auto-levels.""" + contrast is locked to that range; otherwise it re-auto-levels. + + Returns the number of plots whose ``set_data`` SUCCEEDED. A failed paint + is still swallowed (a progressive compute's per-chunk callback must never + fail the compute) and logged at DEBUG, but the count makes the swallow + observable — callers that ignore the return are unaffected, and a caller + that must know whether pixels actually landed (the live signal preview, + and the tests that used to infer it from counters that incremented even + when the paint raised) can assert on it.""" + painted = 0 for sp in list(getattr(tree, "signal_plots", []) or []): try: if levels is not None: @@ -325,8 +334,10 @@ def paint_signal_plots(tree, data, *, levels: tuple[float, float] | None = None) else: sp.needs_auto_level = True sp.set_data(data) + painted += 1 except Exception as e: log.debug("painting signal plot failed: %s", e) + return painted def progress_emitter(prefix: str, *, min_interval: float = 0.5) -> Callable[[int, int], None]: diff --git a/spyde/actions/live_signal.py b/spyde/actions/live_signal.py index a08527ca..86a07ab7 100644 --- a/spyde/actions/live_signal.py +++ b/spyde/actions/live_signal.py @@ -122,6 +122,10 @@ def __init__(self, session, tree, *, render: Callable[[tuple], Any], self.blocks_seen = 0 #: (a) auto-sample paints driven by a landing block self.frames_painted = 0 + #: of those, paints whose set_data actually SUCCEEDED on >=1 signal + #: plot (paint_signal_plots' return) — frames_painted counts attempts, + #: so a swallowed set_data failure is visible as landed < painted. + self.frames_landed = 0 #: (b) navigator-driven reads answered from the already-computed region self.frames_served = 0 #: navigator-driven reads that landed on a position the batch has not @@ -210,7 +214,8 @@ def _paint(self, frame) -> None: def _apply(): if not self._closed: - paint_signal_plots(tree, frame) + if paint_signal_plots(tree, frame) > 0: + self.frames_landed += 1 dispatch = getattr(self.session, "_dispatch_to_main", None) if dispatch is None: diff --git a/spyde/tests/.test_durations b/spyde/tests/.test_durations index c6a8788c..33c8f2a4 100644 --- a/spyde/tests/.test_durations +++ b/spyde/tests/.test_durations @@ -1,2659 +1,2645 @@ { - "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_closing_output_window_unmarks_source_action": 0.6575596999609843, - "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_deselect_hides_output_window_and_clears_artifact": 0.6505354000255466, - "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_running_region_action_tracks_artifact_and_marks_active": 1.627530200057663, - "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_generic_dispatch_stores_action_instance": 0.5767481999937445, - "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_update_vi_reaches_generic_action": 0.5545787001028657, - "spyde/tests/migrated/test_action_dispatch_state.py::TestFailedActionUnlightsButton::test_exception_emits_action_active_false": 0.2165269999532029, - "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_unknown_window_is_noop": 0.000826600007712841, - "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_window_evicts_view_data": 0.0008335000602528453, - "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_keep_alive_and_forget": 0.0008444000268355012, - "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_session_forget_window_evicts_figures": 0.00798869994468987, - "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_all_entries_are_dotted_paths": 0.0010270000202581286, - "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_register_staged_adds_entry": 0.0008500999538227916, - "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_staged_imports_handler": 0.0008693999843671918, - "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_unknown_returns_none": 0.0008653999539092183, - "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_close_window_routes_controller_backed_window": 0.007771599921397865, - "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_controller_close_exception_is_swallowed": 0.007662799907848239, - "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_forget_window_closes_and_evicts": 0.007187599898315966, - "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_register_and_lookup": 0.007733199861831963, - "spyde/tests/migrated/test_api_layer.py::TestApiCenterZeroBeam::test_center_zero_beam_smoke": 0.061121099977754056, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_find_vectors_headless": 2.951375999953598, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_provenance_stamped": 0.00186410010792315, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_map_default_reference": 0.006717099924571812, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_reference_is_zero_beam_filtered": 0.0022195999044924974, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_vector_virtual_image": 0.0017852999735623598, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_empty_detector_raises": 0.001297699986025691, - "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_signal2d": 0.004968399996869266, - "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_import_pulls_no_ui_stack": 0.773838400025852, - "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_source_never_imports_backend_or_drawing": 0.008179299999028444, - "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_api_surface_complete": 0.000836100080050528, - "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_batch_cores_accept_client": 0.0009039000142365694, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderDeclinesArbitraryPositions::test_positions_true_returns_none": 0.015458700014278293, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_fast_path_disabled_without_os_pread": 0.011404099990613759, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frame_bytes": 0.01881009992212057, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frames_are_correct_on_any_platform": 0.022468699957244098, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_pread_matches_memmap_fallback": 0.0005327999824658036, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderMultiDimNav::test_2d_nav_flat_index_matches_expected_frame": 0.016962300054728985, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestCloseAllReaders::test_closes_and_clears_plot_readers": 0.010780800017528236, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_base_array_still_resolves_binary": 0.01552259991876781, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_derived_read_through_resolve_reader_matches_compute": 0.020861199940554798, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_nav_crop_declines": 0.005829899804666638, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_signal_rebin_declines": 0.008387699956074357, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_byte_identical_to_compute": 0.033821800141595304, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_extracts_correct_kwargs_and_offset": 0.06458939984440804, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_no_memmap_source_for_non_memmap_array": 0.0010745999170467257, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_is_safe_on_any_platform": 0.01262009993661195, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_releases_fd": 0.000489800120703876, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_falls_back_to_local_transform_for_derived_view": 0.002011900069192052, - "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_resolves_binary_reader_for_memmap_backed": 0.021670499816536903, - "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_byte_accounting_survives_concurrent_readers": 0.030137399910017848, - "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_lru_evicts_oldest_over_budget": 0.001239500124938786, - "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_single_entry_over_budget_still_served": 0.0013645000290125608, - "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_touching_a_frame_protects_it_from_eviction": 0.001157499966211617, - "spyde/tests/migrated/test_array_cache_core.py::TestClear::test_clear_drops_everything": 0.0011146001052111387, - "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_different_indices_is_a_miss": 0.0011087999446317554, - "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_first_read_is_a_miss": 0.0013098999625071883, - "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_second_read_same_indices_is_a_hit_no_reader_call": 0.0011817999184131622, - "spyde/tests/migrated/test_array_cache_core.py::TestKeyInvalidation::test_different_key_misses_even_for_same_indices": 0.0010761999292299151, - "spyde/tests/migrated/test_array_cache_core.py::TestResidentProbe::test_is_resident_never_calls_reader": 0.0010833998676389456, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_rebin_of_lazy_movie_uses_array_cache": 0.4511160998372361, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_untagged_transform_falls_through_not_cached": 0.38863709999714047, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_data_swap_on_the_same_signal_drops_stale_frames": 0.007881000055931509, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_local_signal_populates_array_cache": 0.0041202998254448175, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_opaque_signal_returns_none": 0.0019305999157950282, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_matches_per_frame_sum_across_a_block_boundary": 0.012570500024594367, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_returns_frame_wise_mean": 0.00978170009329915, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_sums_from_the_block_not_frame_by_frame": 0.009809000068344176, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_is_chunk_granular": 0.004409699933603406, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_never_creates_a_reader": 0.0021873998921364546, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_bytes": 0.002083399798721075, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_parity_and_chunk_memo_reuse": 0.00757710007019341, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_is_chunk_resident_tracks_the_memo": 0.004323399974964559, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_returned_frame_does_not_retain_the_decoded_chunk": 0.004194999812170863, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader2D::test_2d_nav_frame_parity_and_memo": 0.009398299967870116, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_1d_mapping": 0.000941299949772656, - "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_uneven_last_chunk": 0.0008744001388549805, - "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_chunked_source_memoizes_the_nav_block": 0.20189899997785687, - "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_is_chunk_resident_tracks_the_memo": 0.19495459995232522, - "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_oversized_block_falls_back_to_frame_reads": 0.20257330010645092, - "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_single_frame_chunk_does_not_memoize": 0.2211080000270158, - "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_derived_frames_are_the_transformed_ones": 0.04294910002499819, - "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_nav_crop_declines_and_falls_back": 0.03488329995889217, - "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_signal_rebin_declines_and_falls_back": 0.20152479992248118, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_hspy_yields_h5py_dataset": 0.25800180004443973, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_in_ram_ndarray_source_declines": 0.0012198000913485885, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_memmap_source_is_accepted": 0.017000399995595217, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_zspy_yields_zarr_array": 0.611686100019142, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_1d_nav_movie_frames_match": 0.03407520009204745, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_hspy_frames_match_compute": 0.0454463999485597, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_returned_frame_owns_its_memory": 0.00820639985613525, - "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_zspy_frames_match_compute": 0.2531109000556171, - "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_hspy_resolves_source_array_reader": 0.03477440006099641, - "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_zspy_resolves_source_array_reader": 0.20162880013231188, - "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_atoms_locates_the_lattice": 0.0016598000656813383, - "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_then_refine_recovers_the_truth": 0.0014444998232647777, - "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_missing_extra_gives_the_install_line": 0.0011464001145213842, - "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_does_not_move_an_already_centred_atom_much": 0.001119599910452962, - "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_handles_atoms_near_the_edge": 0.0009418000699952245, - "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_pulls_a_jittered_guess_back_toward_the_atom": 0.022942100069485605, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_a_runaway_fit_keeps_its_input_position": 0.006339400075376034, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_all_atoms_pinned_is_a_no_op": 0.0010917999316006899, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_ellipticity_is_recovered_when_present": 0.03176689986139536, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_mask_length_is_checked": 0.0010711000068113208, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_pinned_atoms_keep_their_position_exactly": 0.08676079998258501, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_positions_to_sub_pixel": 0.17179190006572753, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_the_known_widths": 0.017085000057704747, - "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_two_step_beats_the_gaussian_alone_from_a_poor_start": 0.12601709994487464, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_finds_a_real_distortion": 0.041904799989424646, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_is_zero_on_a_perfect_lattice": 0.0011023000115528703, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_does_not_flip_with_orientation": 0.0016606999561190605, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_is_at_least_one": 0.017638000077567995, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_intensity_is_the_fitted_volume": 0.019615299999713898, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_nn_distance_matches_the_lattice_spacing": 0.0020295000867918134, - "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_property_maps_returns_one_value_per_atom": 0.018674199818633497, - "spyde/tests/migrated/test_atoms.py::TestToMap::test_atoms_outside_the_shape_are_dropped_not_wrapped": 0.0008851001039147377, - "spyde/tests/migrated/test_atoms.py::TestToMap::test_length_mismatch_is_caught": 0.001080899965018034, - "spyde/tests/migrated/test_atoms.py::TestToMap::test_pixels_without_an_atom_are_nan": 0.000853499979712069, - "spyde/tests/migrated/test_atoms.py::TestToMap::test_places_values_at_their_atoms": 0.001023799879476428, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_does_not_cancel_to_zero": 0.001043599913828075, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_max_separation_rejects_a_non_dumbbell_lattice": 0.0010801000753417611, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_direction": 0.0011051000328734517, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_separation": 0.04749569995328784, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_too_few_atoms_is_an_error": 0.0008937000529840589, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_works_for_a_diagonal_dumbbell": 0.001079399953596294, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_accepts_an_explicit_vector": 0.0010707000037655234, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_end_to_end_from_the_image": 0.030178399989381433, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_independent_fits_underestimate_the_separation": 0.03228630009107292, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_beats_independent_fitting": 0.07737679989077151, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_recovers_the_true_separation": 0.028700999915599823, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_reports_the_vector_it_used": 0.0013630000175908208, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_survives_refinement_jitter": 0.0018406999297440052, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_a_wrong_vector_leaves_atoms_unpaired": 0.0009412000654265285, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_an_odd_atom_out_is_reported_not_dropped": 0.0009024001192301512, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_no_atom_is_claimed_twice": 0.0013234999496489763, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_pairs_every_atom_on_a_clean_lattice": 0.0013795000268146396, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_partners_are_the_real_partners": 0.0015158000169321895, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_zero_vector_is_rejected": 0.00083580007776618, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_is_folded_to_a_half_turn": 0.0008171000517904758, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_tracks_a_real_rotation": 0.000848500058054924, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_centre_is_the_midpoint": 0.0008497000671923161, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_intensity_ratio_distinguishes_the_two_sites": 0.0009435000829398632, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_one_value_per_pair_not_per_atom": 0.001516799908131361, - "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_separation_matches_the_truth": 0.0015371000627055764, - "spyde/tests/migrated/test_axes.py::TestAxes::test_axes_info_emitted_on_load": 0.21224040002562106, - "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_ignores_garbage_numeric": 0.22634409985039383, - "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_name_and_units": 0.2191823999164626, - "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_scale_writes_back_and_reemits": 0.2091618999838829, - "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_scale_edit_preserves_origin_pixel": 0.38331329997163266, - "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_set_axis_writes_back_and_re_emits": 0.3712916999356821, - "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_a_live_move_does_not_emit_state": 0.13887990009970963, - "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_the_release_emits_state": 0.15548439999110997, - "spyde/tests/migrated/test_background_drag.py::TestScoping::test_closing_removes_the_band_and_the_curve": 0.1434115000301972, - "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_a_window_right_of_the_peak_does_not_explode": 0.7497764000436291, - "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_it_is_left_at_zero_when_the_axis_does_not_reach_it": 0.08245380013249815, - "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_the_origin_is_moved_off_a_zero_based_axis": 0.19584079994820058, - "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_a_dict_event_works_too": 0.18898949993308634, - "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_an_event_without_a_source_is_ignored": 0.08840460004284978, - "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_geometry_comes_off_event_source": 0.4170634001493454, - "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_window_is_normalised": 0.17465910012833774, - "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_only_one_background_line_exists": 0.27073890005704015, - "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_curve_changes_when_the_band_moves": 0.15708230005111545, - "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_line_is_updated_in_place_not_rebuilt": 0.3859299001051113, - "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_contains_is_side_effect_free": 0.0027354001067578793, - "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_keys_are_scoped_per_owner": 0.0017257999861612916, - "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_miss_then_hit": 0.001280000084079802, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_clear_resets_accounting": 0.001743700006045401, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_drop_owner_leaves_others": 0.0018650998827069998, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_evicts_lru_over_budget": 0.0022817000281065702, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_hit_refreshes_recency": 0.0023311999393627048, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_oversized_block_still_served": 0.0026692000683397055, - "spyde/tests/migrated/test_block_cache.py::TestEviction::test_region_span_stays_resident": 0.0809546000091359, - "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_is_idempotent": 0.002396599971689284, - "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_shrinks_but_keeps_working_set": 0.404282100033015, - "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_restore_returns_full_budget": 0.0015159000176936388, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_int32_region_mean_is_accurate": 0.0014082000125199556, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float16]": 0.0008024999406188726, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float32]": 0.0013273999793455005, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[int16]": 0.0007990999147295952, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[uint8]": 0.0008119998965412378, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_above_the_cap_falls_back": 0.0007441999623551965, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_at_the_cap_uses_float32": 0.0008182000601664186, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[float64]": 0.0007938999915495515, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[int32]": 0.0009665001416578889, - "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[uint32]": 0.0008223999757319689, - "spyde/tests/migrated/test_block_cache.py::TestThreadSafety::test_concurrent_put_keeps_accounting_consistent": 0.08657060016412288, - "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_client_none_is_honoured": 0.01611539989244193, - "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_explicit_client_still_returned": 0.01565350010059774, - "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_idempotent": 0.0007014001021161675, - "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_patch_applied": 0.0006877999985590577, - "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_synchronous_read_returns_correct_frame": 0.013798999949358404, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_activating_automatic_tab_shows_full_frame_box_immediately": 0.4785641999915242, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_centers_beam": 0.6000312999822199, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_region_shows_draggable_widget_and_run_uses_it": 0.5761702999006957, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_manual_center_from_crosshair": 0.6030144999967888, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_node_switch_tears_down_region_and_markers": 0.4691024998901412, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_drag_handler_runs_once_per_event": 0.4634034999180585, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_widget_torn_down_on_close": 0.475860400008969, - "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_tree_close_tears_down_region_widgets": 0.4769122999859974, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_batched_submit_prime_then_bulk": 0.07856290019117296, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancel_stops_the_dispatch": 0.029777899966575205, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancelled_handle_is_not_delivered": 0.0011166000040248036, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_one_cancellable_handle_registered": 0.030684899888001382, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_plot_update_worker_accepts_the_handle": 0.0011494000209495425, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_result_is_assembled_not_recomputed": 0.03382839995902032, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_submits_unpinned": 0.024816500023007393, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_worker_finds_the_handle_through_hyperspys_data_setter": 0.004901299835182726, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_client_submit_inside_a_loop_outside_the_dispatcher": 1.2849565000506118, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_second_whole_array_compute_in_the_nav_fill": 0.0011719998437911272, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_guard_actually_catches_the_pattern": 0.0008638999424874783, - "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_navigator_fill_calls_the_dispatcher": 0.0032561998814344406, - "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_balanced_cube_splits_the_signal": 0.00995029998011887, - "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_one_frame_per_chunk_movie_is_not_split": 0.010645700036548078, - "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_eager_data_has_no_chunking": 0.0067868001060560346, - "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_long_chunk_lists_are_truncated_but_counted": 0.010261400137096643, - "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_storage_aligned_chunks_are_not_split": 0.012493400019593537, - "spyde/tests/migrated/test_close.py::TestCloseWindow::test_closing_unknown_window_still_notifies_renderer": 0.00877689989283681, - "spyde/tests/migrated/test_close.py::TestCloseWindow::test_lone_signal_window_closes_its_tree": 0.16227079986128956, - "spyde/tests/migrated/test_close.py::TestCloseWindow::test_navigator_close_closes_the_whole_tree": 0.20564710022881627, - "spyde/tests/migrated/test_close.py::TestCloseWindow::test_signal_close_closes_only_that_window": 0.20502530003432184, - "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_close_flips_registered_flag_and_cancels_future": 0.21304670011159033, - "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_register_on_already_closed_tree_flips_immediately": 0.24111240007914603, - "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_unregister_drops_from_registry": 0.21560889994725585, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_attrs_and_provenance": 0.028821699903346598, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_creates_exactly_one_tree_with_views": 0.05838489986490458, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_on_tree_hook_runs_and_failure_is_swallowed": 0.05028580001089722, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_rgb_primary_autolevels_without_clim": 0.02760769973974675, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_root_signal_carries_primary_data": 0.06370519998017699, - "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_view_data_evicted_when_window_closes": 0.060902099939994514, - "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_accepts_prepared_signal_and_signal_type": 0.033623000024817884, - "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_opens_new_tree_with_title_and_provenance": 0.03234179993160069, - "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_live_search_silver": 2.025348300114274, - "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_emits_results": 0.0010176999494433403, - "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_handles_network_error": 0.000991899985820055, - "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_fetch_cod_cif_writes_file": 0.025914999889209867, - "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_dedupes_and_sorts_by_cell": 0.0009016002295538783, - "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_skips_rows_without_a_cell": 0.0008441000245511532, - "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_read_empty": 0.007992799975909293, - "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_set_composition_handler_writes_and_emits": 0.004440800053998828, - "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_read_roundtrip": 0.007501599960960448, - "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_without_percentages": 0.007354100001975894, - "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_apply_sets_env_persists_and_restarts": 0.01955580001231283, - "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_empty_payload_is_a_noop": 0.0020577999530360103, - "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_values_clamped_and_bad_gpu_defaulted": 0.002823100076057017, - "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_current_config_reads_env": 0.0011708000674843788, - "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_startup_loads_settings_env_wins": 0.020620100083760917, - "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_is_side_effect_free": 0.020192199968732893, - "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_one_level": 0.03154140000697225, - "spyde/tests/migrated/test_console.py::TestCompletion::test_builtin_names_complete": 0.01830390002578497, - "spyde/tests/migrated/test_console.py::TestCompletion::test_prefix_completion": 0.05482929991558194, - "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_action_dispatch": 0.01856279990170151, - "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_exec_via_app_command_envelope": 0.01863870001398027, - "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_assignment_registers_name_but_echoes_nothing": 0.0269177999580279, - "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_expression_echoes_value_and_registers_out": 0.05011350009590387, - "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_multi_statement_with_trailing_expression": 0.019497300032526255, - "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_none_valued_expression_registers_no_out": 0.01933049992658198, - "spyde/tests/migrated/test_console.py::TestErrors::test_name_error_surfaces": 0.019572900258935988, - "spyde/tests/migrated/test_console.py::TestErrors::test_runtime_error_reports_traceback_and_keeps_namespace": 0.041718500084243715, - "spyde/tests/migrated/test_console.py::TestErrors::test_syntax_error_reports_ok_false": 0.019534299965016544, - "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_dask_array_expression_reports_lazy": 0.028675899957306683, - "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_signal_comparison_stays_lazy": 0.11525570007506758, - "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_1d_ndarray_is_signal1d": 0.07636760000605136, - "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_lazy_result_stays_lazy": 0.11712330009322613, - "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_ndarray_creates_tree": 0.06832149997353554, - "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_scalar_refuses_politely": 0.030404799967072904, - "spyde/tests/migrated/test_console.py::TestMaterialisation::test_show_helper_opens_window": 0.06406510004308075, - "spyde/tests/migrated/test_console.py::TestNamespace::test_hs_and_da_available": 0.03133030002936721, - "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_array_expression_kind_ndarray": 0.018906299956142902, - "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_available": 0.0194551000604406, - "spyde/tests/migrated/test_console.py::TestNamespace::test_persistence_across_execs": 0.040350700030103326, - "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_assigned_var": 0.04808829992543906, - "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_out_chip": 0.041507799993269145, - "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_signal_binding_noop": 0.2534517999738455, - "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_via_action_dispatch": 0.03616979985963553, - "spyde/tests/migrated/test_console.py::TestSignalBindings::test_binding_removed_on_tree_close": 0.2719489000737667, - "spyde/tests/migrated/test_console.py::TestSignalBindings::test_positional_aliases_track_load_order": 0.07577980018686503, - "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_binding_has_window_ids": 0.23462210001889616, - "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_exposed_as_name_and_positional_alias": 0.23534899996593595, - "spyde/tests/migrated/test_console.py::TestSignalBindings::test_titled_signal_gets_sanitized_name": 0.06369789992459118, - "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_captured": 0.01984630001243204, - "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_with_trailing_expression": 0.019717900082468987, - "spyde/tests/migrated/test_console.py::TestVarsSchema::test_out_chip_appears_in_vars": 0.018306899932213128, - "spyde/tests/migrated/test_console.py::TestVarsSchema::test_vars_schema_exact": 0.23715260007884353, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(a, b)-True]": 0.0023444999242201447, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(x := 1)-False]": 0.0010133999167010188, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[-s1 + 2 * b-True]": 0.0022488998947665095, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[i for i in s1]-False]": 0.0010187000734731555, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[s1]-False]": 0.0010067998664453626, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a and not b-True]": 0.0020881000673398376, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a if b else c-False]": 0.0010028000688180327, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[f'{s1}'-False]": 0.0010227999882772565, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[lambda: 1-False]": 0.0010161000536754727, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[np.log(s1)-False]": 0.0010279000271111727, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1 > 100-True]": 0.002359699923545122, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.data-True]": 0.0022508000256493688, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum()-False]": 0.0010221998672932386, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum(axis=(0,1))-False]": 0.0010307999327778816, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum-True]": 0.0022887999657541513, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0:2, ::2]-True]": 0.0023317000595852733, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0]-True]": 0.0022392000537365675, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[x = 1-False]": 0.0009948000079020858, - "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[{'a': 1}-False]": 0.0010149000445380807, - "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_exec_cancels_queued_preview": 0.9200192998396233, - "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_superseded_preview_never_emits": 0.926952000008896, - "spyde/tests/migrated/test_console_preview.py::TestCostGuard::test_nav_sum_is_too_expensive": 0.25758510001469404, - "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_no_selector_falls_back_to_frame_zero": 0.2508089999901131, - "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_thumbnail_reflects_cursor": 0.24463600013405085, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_exec_clears_nav_refresh": 0.6304359000641853, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_explicit_preview_not_nav_tracked": 0.6219336000503972, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_hook_registered_and_removed": 0.009428700082935393, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_nav_move_reemits_at_new_cursor": 0.26635429984889925, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_run_update_fires_hook_only_on_change": 0.2495276000117883, - "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_stop_clears_nav_refresh": 0.6195201999507844, - "spyde/tests/migrated/test_console_preview.py::TestPreviewNeverComputesFull::test_lazy_comparison_previews_one_frame": 0.22816059994511306, - "spyde/tests/migrated/test_console_preview.py::TestPreviewSideEffectFree::test_no_chips_no_console_result": 0.019960499950684607, - "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_image_thumbnail_matches_pipeline": 0.2406090999720618, - "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_scalar": 0.02091600012499839, - "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_nan_becomes_null": 0.037375699961557984, - "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_strided_and_capped": 0.04270139988511801, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_explicit_autolevel_recomputes": 0.0020359999034553766, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_checkerboard_placeholder": 0.00153929996304214, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_zero_frame": 0.0014734001597389579, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frames_hold_contrast": 0.0017216999549418688, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_relevels_each_recompute": 0.0019715999951586127, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_still_paints_blank_frame": 0.0017508999444544315, - "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_user_clim_is_held_across_navigated_frames": 0.0014925000723451376, - "spyde/tests/migrated/test_crop_action.py::TestCropInToolbar::test_crop_available_on_a_2d_signal_plot": 0.2716844999231398, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_close_tears_down_widget_without_running": 0.2134306998923421, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_drag_clamp_handler_runs_once_per_event": 0.24825210007838905, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_full_frame_widget_is_a_noop_run": 0.21743310010060668, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_node_switch_tears_down_widget": 0.2151554999873042, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_open_shows_draggable_widget_covering_full_frame": 0.22385389998089522, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_tree_close_tears_down_widget": 0.213740200153552, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_typed_field_edit_moves_the_widget": 0.23123329994268715, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_drives_a_nonsquare_crop": 0.436430900124833, - "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_partially_out_of_bounds_is_clamped": 0.4228688000002876, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_all_zero_crop_is_a_noop": 0.010317599982954562, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_crop_preserves_values": 0.008345199865289032, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_out_of_range_end_is_clamped": 0.015844499925151467, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_and_time_crop": 0.021094299969263375, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_crop_only_lazy": 0.023930600029416382, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_start_at_zero_is_a_real_crop_not_full": 0.01970379997510463, - "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_zero_spatial_ranges_keep_full_frame": 0.015921499929390848, - "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_adds_a_cropped_node": 0.4377955000381917, - "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_keeps_a_lazy_movie_lazy": 0.4523397000739351, - "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[cpu-numba]": 0.7994300998980179, - "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[gpu]": 0.00972659990657121, - "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_torch_matches_numpy_bit_for_bit": 0.37399390002246946, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_frame_lands_where_the_arithmetic_says": 0.024309200001880527, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_partial_edge_block_is_cropped_not_wrapped": 0.025942299980670214, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[0]": 0.0148661999264732, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[1]": 0.015063200145959854, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_repeated_events_on_one_pixel_add": 0.00796369998715818, - "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_the_reference_decoder_agrees": 0.0074905999936163425, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad0]": 0.006472600041888654, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad1]": 0.006339799962006509, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad2]": 0.005998399923555553, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad3]": 0.00627170002553612, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-1]": 0.006595399812795222, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-2]": 0.007257799967192113, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-4]": 0.007510400144383311, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[1-3]": 0.0074393999530002475, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[3-4]": 0.0062917000614106655, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[2]": 0.006776700145564973, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[4]": 0.006590600009076297, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_plane_counts_match_the_decoded_frames": 0.005804899847134948, - "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_ranges_are_additive": 0.006365199922583997, - "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_an_explicit_cpu_backend_is_passed_through": 0.006905500078573823, - "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_torch_without_a_device_falls_back_and_still_integrates": 0.006043200031854212, - "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_a_partial_edge_block_keeps_its_stride": 0.015015300014056265, - "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_an_empty_payload_reads_as_zero_events": 0.006165500148199499, - "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_block_grid_and_padding": 0.00582570000551641, - "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_fields_come_back_off_the_documented_offsets": 0.005900099873542786, - "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_each_block_is_exactly_one_plane": 0.031856399960815907, - "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_reading_one_plane_does_not_compute_the_others": 0.015107600018382072, - "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_the_exposure_does_not_change_the_block_shape": 0.009057799819856882, - "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_matching_path_shows_the_action": 0.0009916000999510288, - "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_raising_lookup_is_refused_not_propagated": 0.0008209999650716782, - "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_signal_without_original_metadata_is_refused": 0.0007733000675216317, - "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_no_gate_means_always_visible": 0.0007636999944224954, - "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_apply_registers_and_is_idempotent": 0.000914999982342124, - "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_csb_is_an_openable_extension": 0.0007687999168410897, - "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_spec_matches_the_yaml": 0.0023934999480843544, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_short_file": 0.004489800077863038, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_truncated_block_table": 0.014572900137864053, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_wrong_magic": 0.013695700094103813, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw0]": 0.016075799940153956, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw1]": 0.013440200127661228, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw2]": 0.015382900019176304, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw3]": 0.01350980019196868, - "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw4]": 0.01366759988013655, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_it_does_not_touch_the_process_tree": 0.0011133999796584249, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_repeated_shutdown_stays_cheap": 0.0019386999774724245, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_shutdown_is_immediate_when_start_was_never_called": 0.0011511999182403088, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_live_cluster_still_reaps_even_without_the_thread": 0.5804970000172034, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_started_manager_still_reaps": 0.5824472999665886, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_client]": 0.5758561999537051, - "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_cluster]": 0.5762895001098514, - "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_shape_and_sums": 0.006169400061480701, - "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_tolerates_missing_fields": 0.0012458999408409, - "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_missing_nvidia_smi_disables_permanently": 0.0010160000529140234, - "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_parses_nvidia_smi": 0.0010220000986009836, - "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_transient_failure_keeps_last_reading": 0.0010824999772012234, - "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_cluster_mem_frac": 0.0007241999264806509, - "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_lane_cap_shrinks_when_hot": 0.0007226001471281052, - "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_worker_memory_limit": 0.0009316998766735196, - "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_auto_trim_runs_on_workers": 0.44998670008499175, - "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_trim_runs_and_reports_rss": 0.4698974002385512, - "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_positive_still_blurs": 0.0034203999675810337, - "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_zero_returns_raw_block_no_copy": 0.001879699993878603, - "spyde/tests/migrated/test_dask_stats.py::TestSampler::test_emits_from_fake_client": 0.06570720009040087, - "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_budget_is_75_percent_of_cores": 0.0008277000160887837, - "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_fraction_override_and_clamp": 0.0008555998792871833, - "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_drops_to_below_normal": 0.0007955998880788684, - "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_opt_out": 0.0008341000648215413, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_displays_real_data": 0.17977649997919798, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_opens_one_window": 0.18283499998506159, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_diffraction_pattern_fills_with_real_data": 0.2127434000140056, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_navigator_fills_with_real_data": 0.21338059997651726, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_stem_opens_navigator_and_signal": 0.2027273999992758, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_histogram_emitted": 0.228584099910222, - "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_metadata_emitted": 0.21760770003311336, - "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_holds_lock_on_mps": 0.004282899899408221, - "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_noop_off_mps": 0.005808800109662116, - "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_released_on_exception": 0.0029168998589739203, - "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_serialises_two_threads": 0.03161880013067275, - "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_syncs_before_release": 0.001039499999023974, - "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_calibration_locks": 0.0031724999425932765, - "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_single_frame_preview_locks": 0.0030288000125437975, - "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_fit_runs_under_the_lock": 0.004372200113721192, - "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_no_deadlock_against_concurrent_users": 0.03227169986348599, - "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_off_mps_is_a_passthrough": 0.0027855999069288373, - "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_yield_hands_the_device_back": 0.006477500079199672, - "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_find_vectors_torch_reuses_the_shared_lock": 0.0009329000022262335, - "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_lock_is_reentrant": 0.009223600034601986, - "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_mps_forward_lock_is_the_shared_lock": 0.008106700028292835, - "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_average_dot_product_map_locks": 0.0021677000913769007, - "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_dictionary_index_locks": 0.007597199990414083, - "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_fit_batched_locks_every_chunk": 0.2615726001095027, - "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_remove_background_locks": 0.032099499949254096, - "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_the_live_single_pattern_match_locks": 0.002956199925392866, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_band_that_misses_the_detector_is_dropped": 0.005261299898847938, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_wrong_orientation_does_not_land_on_them": 0.020949000143446028, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_every_line_sits_on_a_local_intensity_peak": 0.01824140001554042, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_max_bands_keeps_the_strongest": 0.00543589994776994, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_pixel_convention_is_centre_on_integer": 0.004131100024096668, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_are_the_line_collection_shape": 0.0015833000652492046, - "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_stay_inside_the_detector": 0.0022486000088974833, - "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_a_sample_rotation_does_change_the_pattern": 0.004053200129419565, - "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_crystal_symmetry_leaves_the_pattern_alone": 0.13678800000343472, - "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_euler_matrix_matches_orix": 0.0013442999916151166, - "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_normals_to_sample_is_the_transpose": 0.0011661999160423875, - "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_directions_are_unit_vectors": 0.0014068001182749867, - "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_y_is_flipped": 0.0010516000911593437, - "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_reflectors_dataclass_broadcasts_scalars": 0.0007984001422300935, - "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_wavelength_is_relativistic": 0.0007200000109151006, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_a_structureless_phase_falls_back": 0.021061399951577187, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_is_a_subset": 0.00288459996227175, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_none_is_a_no_op": 0.0015044000465422869, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_cubic_set_is_friedel_unique": 0.0027411000337451696, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_from_a_real_phase": 0.4775120000122115, - "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_widths_and_weights_are_per_reflector": 0.002664599916897714, - "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_axes_fall_where_bands_cross": 0.004350799950771034, - "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_points_stay_on_the_detector": 0.0031302000861614943, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestAgainstLiveKikuchipy::test_reference_still_matches_kikuchipy": 0.0017799000488594174, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_a_square_detector_is_unaffected_by_the_aspect_ratio": 0.0046079999301582575, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[nonsquare-60x80]": 0.006220199982635677, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[square-60x60]": 0.005122499889694154, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape0-pc0]": 0.0018925999756902456, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape1-pc1]": 0.0020373001461848617, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape0-pc0]": 0.005470800097100437, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape1-pc1]": 0.005719499895349145, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[nonsquare-60x80]": 0.008615899947471917, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[square-60x60]": 0.005496299942024052, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[nonsquare-60x80]": 0.005943999974988401, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[square-60x60]": 0.009656599955633283, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-both]": 0.006154899834655225, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-x]": 0.006349200033582747, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-y]": 0.006032399833202362, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-transpose]": 0.006229799939319491, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-both]": 0.006279599969275296, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-x]": 0.006078700069338083, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-y]": 0.006338700070045888, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-transpose]": 0.006338699953630567, - "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_dropping_the_aspect_ratio_would_be_rejected": 0.005802600062452257, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_builds_from_euler_angles": 0.033813900081440806, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_carries_scores_as_a_property": 0.004134100046940148, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_phase_symmetry_comes_from_the_space_group": 0.005968799930997193, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_step_scales_the_coordinates": 0.005322399898432195, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestEndToEnd::test_index_then_colour_recovers_the_grain_structure": 1.1217486000386998, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_is_rgb_shaped_for_the_existing_display": 0.01841820008121431, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_one_orientation_gives_one_colour": 0.022108200122602284, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_shape_and_range": 0.018509500077925622, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_the_two_grains_get_different_colours": 0.018206600099802017, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_mismatched_coverage_is_caught": 0.0009269000729545951, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_picks_the_higher_scoring_phase_per_position": 0.0014748000539839268, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_reshapes_to_the_scan": 0.0008462000405415893, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_a_boundary_shows_as_low_agreement": 0.001061100047081709, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_detects_a_confidently_wrong_position": 0.0010506999678909779, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_partial_overlap_is_between_zero_and_one": 0.0009971001418307424, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_rejects_a_mismatched_shape": 0.0010019000619649887, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_requires_a_nav_shape": 0.0008236001012846828, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_uniform_indexing_scores_one": 0.0012381999986246228, - "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_works_on_a_real_indexing_result": 0.6924272999167442, - "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_every_similarity_matches": 0.0022276999661698937, - "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_mps_matches_the_reference_too": 0.0005163000896573067, - "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_same_pattern_wins": 0.0015197000466287136, - "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_winning_score_matches": 0.0015521999448537827, - "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_tiling_does_not_move_us_off_the_reference": 0.0016465999651700258, - "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_invariant_to_gain_and_offset": 0.0342546000611037, - "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_survives_a_detector_background": 0.06469889997970313, - "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_a_finer_dictionary_matches_better": 14.803757399902679, - "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_background_removal_is_what_makes_scores_near_one": 0.03688290005084127, - "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_exact_dictionary_recovers_every_orientation": 0.08925499999895692, - "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_grain_two_indexes_consistently": 1.553974400041625, - "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_the_two_grains_index_differently": 1.6569661002140492, - "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_covers_the_cubic_fundamental_zone": 0.0009728999575600028, - "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_finer_step_gives_a_bigger_dictionary": 0.0009643998928368092, - "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_accepts_flattened_or_image_shaped_patterns": 0.03334970003925264, - "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_mismatched_detector_size_is_caught": 0.010776599985547364, - "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_orientations_reshape_to_the_scan": 0.5529569002101198, - "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_progress_reports_completion": 0.033861099975183606, - "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_keep_larger_than_the_dictionary_is_clamped": 0.004474599962122738, - "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_scores_are_sorted_best_first": 0.6085278001846746, - "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_tiled_equals_untiled": 0.9738501999527216, - "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_top_k_survives_tiling": 0.9002104001119733, - "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_is_differentiable_wrt_orientation": 0.005797699908725917, - "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_matches_the_numpy_generator": 0.0046159999910742044, - "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_chunked_matches_unchunked": 0.7798252999782562, - "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_each_pattern_gets_its_own_orientation": 0.5310014999704435, - "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_result_maps_back_to_the_scan": 0.04416329995729029, - "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_shape_mismatch_is_caught": 0.0016967998817563057, - "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_a_failing_callback_does_not_kill_the_refine": 0.0825092998566106, - "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_yield_is_called_inside_the_step_loop": 0.17299840005580336, - "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_is_differentiable": 0.01584170013666153, - "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_matches_the_numpy_reference": 0.005256499978713691, - "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_produces_proper_rotations": 0.008607299998402596, - "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_beats_a_coarse_dictionary": 1.4585566001478583, - "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_never_returns_a_worse_orientation": 0.13300739997066557, - "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_recovers_a_perturbed_orientation": 4.426738000009209, - "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_reports_the_score_it_started_from": 0.26682850008364767, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_a_different_position_gives_different_bands": 1.229621300008148, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_draws_line_segments_for_the_matched_orientation": 1.192475900053978, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_hiding_clears_both_marker_groups": 1.1645681000081822, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_streams_the_match_to_the_caret": 1.2474584998562932, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_adopts_the_projection_centre_the_data_records": 1.1881843000883237, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_announces_itself_to_the_caret": 1.1780465000774711, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_builds_a_wizard_with_a_resident_dictionary": 1.8444797999691218, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_no_background_means_no_simulated_filter": 1.193687100079842, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_rebuilding_replaces_the_previous_wizard": 1.463646600022912, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_static_only_does_not_filter_the_dictionary": 1.225205700029619, - "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_the_dictionary_is_filtered_like_the_data": 1.234738199855201, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_eager_data_still_gets_a_bounded_chunking": 9.37379390001297, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_is_one_lazy_graph_over_the_chunks": 0.046650299918837845, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_reads_the_scan_chunk_by_chunk": 1.6016813999740407, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_patterns_split_across_chunks_are_merged": 0.04640270001254976, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_adp_map_is_seamless_across_chunks": 0.976050799828954, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_lazy_signals_own_chunking_is_left_alone": 0.041308999876491725, - "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_static_reference_is_streamed_too": 1.320837400155142, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_band_count_and_zone_axes_apply_live": 1.210718399961479, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_is_a_no_op_before_the_dictionary_exists": 0.9018372000427917, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_moving_the_projection_centre_moves_the_lines": 1.1950769000686705, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_indexes_the_scan_into_an_ipf_window": 1.5067712999880314, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_refuses_before_the_dictionary_is_built": 0.9377203999320045, - "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_the_ipf_map_shows_the_two_grains": 1.4428976001217961, - "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_every_stage_resolves": 0.0006607001414522529, - "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_overlay_toggle_reaches_the_wizard": 1.1945803997805342, - "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_schema_is_registered_and_matches_the_defaults": 0.000695900060236454, - "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_toolbar_entry_is_gated_on_the_ebsd_signal_type": 0.0006571999983862042, - "spyde/tests/migrated/test_event_handler_bound_method.py::test_bound_method_raises_on_faithful_widget": 0.002580000087618828, - "spyde/tests/migrated/test_event_handler_bound_method.py::test_event_handler_fn_makes_bound_method_registerable": 0.0019729998894035816, - "spyde/tests/migrated/test_event_handler_bound_method.py::test_wrapper_preserves_name": 0.0016320000868290663, - "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_data_dir_is_reported_even_when_nothing_is_downloaded": 0.0007761998567730188, - "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_the_catalogue_never_opens_a_data_file": 0.0033318999921903014, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_downloaded_reflects_the_file_on_disk": 0.0037418000865727663, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_every_entry_has_what_the_menu_draws": 0.003299900097772479, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_lists_datasets_grouped_by_technique": 0.011254100012592971, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_resolve_round_trips_a_key": 0.003197800018824637, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_base_class_is_not_a_dataset": 0.0009065999183803797, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_camera_is_carried_through": 0.003235599957406521, - "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_modalities_spyde_is_built_around_come_first": 0.0051331998547539115, - "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_an_undownloaded_dataset_without_a_declared_shape_shows_none": 0.0008072999771684408, - "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_declared_shape_wins_over_reading_the_file": 0.0009165999945253134, - "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_record_shape_stamps_what_a_load_already_knows": 0.010452000075019896, - "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_shape_of_signal_is_nav_then_signal": 0.003412799909710884, - "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_cancel_raises": 0.0008950001792982221, - "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_done_clamped_to_total": 0.0008636998245492578, - "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_pooch_protocol_sequence": 0.004872200079262257, - "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_cancel_flow": 0.0009494000114500523, - "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_done_emitted_only_when_started": 0.0009169999975711107, - "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_the_monitor_is_a_pooch_progressbar": 0.0015758000081405044, - "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_handles_frame_edges": 0.001309799961745739, - "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_more_stable_than_point_sample": 0.06308759981766343, - "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_find_vectors_stores_disk_mean_intensity": 0.005474900011904538, - "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_gpu_pack_ghost_to_core_frame_index": 0.0016774999676272273, - "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_radius_below_one_falls_back_to_point": 0.0014491999754682183, - "spyde/tests/migrated/test_find_vectors.py::test_at_correct_row_count": 0.0011794000165537, - "spyde/tests/migrated/test_find_vectors.py::test_auto_params_valid_ranges": 0.03248389984946698, - "spyde/tests/migrated/test_find_vectors.py::test_count_map_shape_and_values": 0.001132899895310402, - "spyde/tests/migrated/test_find_vectors.py::test_detects_known_peaks": 0.004819200141355395, - "spyde/tests/migrated/test_find_vectors.py::test_disk_kernel_cached": 0.0009027000050991774, - "spyde/tests/migrated/test_find_vectors.py::test_flatten_full_buffer": 0.0010731000220403075, - "spyde/tests/migrated/test_find_vectors.py::test_from_ragged_roundtrip": 0.0014015000779181719, - "spyde/tests/migrated/test_find_vectors.py::test_kxy_at_correct_columns": 0.0011020000092685223, - "spyde/tests/migrated/test_find_vectors.py::test_map_blocks_wrong_at_chunk_boundary": 0.019354499992914498, - "spyde/tests/migrated/test_find_vectors.py::test_map_overlap_correct_at_chunk_boundary": 0.05217230005655438, - "spyde/tests/migrated/test_find_vectors.py::test_min_distance_prevents_duplicates": 0.007418300025165081, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_cold_fallback": 0.016015399945899844, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_edge_accuracy": 0.025526899960823357, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_invalidate_clears": 0.0008611001539975405, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_stale_guard": 0.006653399905189872, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_hit": 0.0075795999728143215, - "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_speed": 1.389591999934055, - "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_larger_than_depth": 0.0007240000413730741, - "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_within_memory_limit": 0.0007917000912129879, - "spyde/tests/migrated/test_find_vectors.py::test_output_shapes": 0.0023194998502731323, - "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_4d": 0.006447399966418743, - "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_5d": 0.006426700041629374, - "spyde/tests/migrated/test_find_vectors.py::test_single_frame_pipeline_under_20ms": 0.09987879998516291, - "spyde/tests/migrated/test_find_vectors.py::test_spots_at_returns_list": 0.00128030008636415, - "spyde/tests/migrated/test_find_vectors.py::test_subpixel_refinement_produces_fractional_coords": 0.003813600051216781, - "spyde/tests/migrated/test_find_vectors.py::test_threshold_controls_count": 0.006134500028565526, - "spyde/tests/migrated/test_find_vectors.py::test_to_dense_shape_and_cache": 0.0011765999952331185, - "spyde/tests/migrated/test_find_vectors.py::test_to_pyxem_type": 0.004579099942930043, - "spyde/tests/migrated/test_find_vectors.py::test_zero_frame_no_peaks": 0.0016149000730365515, - "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_auto_from_signal_samples_sparsely": 0.021863700007088482, - "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_lollipop": 0.002602500026114285, - "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_none_when_featureless": 0.00201370008289814, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_dog_route": 0.0027298000641167164, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_nxcorr_route_still_works": 0.004466200014576316, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_beamstop_auto_memory_safe": 0.14798610005527735, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_lazy_batch_memory_safe": 0.12381579994689673, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_numpy_batch": 0.1644525999436155, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_beamstop_excludes_and_no_rim_peak": 0.0021982999751344323, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_finds_all_spots": 0.0031622000969946384, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_intensity_column_is_raw": 0.0028924000216647983, - "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_subpixel_shifts_off_integer": 0.0021934998221695423, - "spyde/tests/migrated/test_find_vectors_memory.py::test_5d_nav_shape": 0.17451469984371215, - "spyde/tests/migrated/test_find_vectors_memory.py::test_all_positions_present_in_offsets": 0.04530750005505979, - "spyde/tests/migrated/test_find_vectors_memory.py::test_at_returns_correct_slice_lengths": 0.05090529995504767, - "spyde/tests/migrated/test_find_vectors_memory.py::test_at_row_columns_match_full_flat_buffer": 0.04889550001826137, - "spyde/tests/migrated/test_find_vectors_memory.py::test_chunk_boundary_result_equals_single_chunk": 0.11633890005759895, - "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_dtype_is_int32": 0.04794330010190606, - "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_sums_to_flat_buffer_len": 0.05066920001991093, - "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_never_computes_full_array": 2.143751399940811, - "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_produces_correct_nav_shape": 0.1904871000442654, - "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_columns_in_calibrated_range": 0.04605280014220625, - "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_dtype_is_float32": 0.03255959996022284, - "spyde/tests/migrated/test_find_vectors_memory.py::test_high_threshold_gives_fewer_vectors": 0.06573610007762909, - "spyde/tests/migrated/test_find_vectors_memory.py::test_intensity_column_is_raw_frame_intensity": 0.04656479984987527, - "spyde/tests/migrated/test_find_vectors_memory.py::test_large_nav_does_not_compute_full_array": 1.7907855999656022, - "spyde/tests/migrated/test_find_vectors_memory.py::test_live_count_chunk_writes_global_location": 0.02099580003414303, - "spyde/tests/migrated/test_find_vectors_memory.py::test_nav_coords_in_range": 0.061485399841330945, - "spyde/tests/migrated/test_find_vectors_memory.py::test_no_full_compute_via_tracemalloc": 1.4765213000355288, - "spyde/tests/migrated/test_find_vectors_memory.py::test_non_square_nav": 0.05507710005622357, - "spyde/tests/migrated/test_find_vectors_memory.py::test_numpy_path_allowed_to_hold_full_array": 0.061281500034965575, - "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_dtype_is_int64": 0.043623499921523035, - "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_monotonically_non_decreasing": 0.045493700075894594, - "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_called_covering_full_nav": 0.10952109994832426, - "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_count_subarray_matches_final": 0.08579889999236912, - "spyde/tests/migrated/test_find_vectors_memory.py::test_reproducible_with_same_params": 0.19447450013831258, - "spyde/tests/migrated/test_find_vectors_memory.py::test_result_offsets_never_exceed_buffer_length": 0.10023500001989305, - "spyde/tests/migrated/test_find_vectors_memory.py::test_single_nav_position": 0.02176149992737919, - "spyde/tests/migrated/test_find_vectors_memory.py::test_stopped_flag_returns_none": 0.01935269997920841, - "spyde/tests/migrated/test_find_vectors_memory.py::test_zero_signal_produces_no_vectors": 0.05262110009789467, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_chunk_passes_persistence": 0.0009193000150844455, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_carries_bg_sigma": 0.0007101999362930655, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_neural_no_nav_blur_and_spot_radius": 0.0007209999021142721, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_dask_spawn_method_pinned": 0.003161399974487722, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_default_device_chain": 0.0008860999951139092, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_detect_batch_runtimeerror_cpu_retry": 0.010057999868877232, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_emit_calibration_wiring": 0.005278500146232545, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_fv_refresh_models_emits": 0.000900499988347292, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_conc_one_on_mac_serializes": 0.0009508001385256648, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_policy_modes": 0.0011006999993696809, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_lane_split_default_mode": 0.0010355999693274498, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_allowed_platform_gate": 0.00102980004157871, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_cpu_escape_hatch_on_mac": 0.0010658000828698277, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_uses_mps_by_default_on_mac": 0.001016200054436922, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_fallback_env_set_on_darwin": 0.003557700081728399, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_enabled_gate": 0.0010710001224651933, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_lane_pins_single_worker": 0.0009144999785348773, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_block_respects_gpu_off": 0.001026200014166534, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_default_and_models_payload": 0.002931899973191321, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_gpu_demote_flag": 0.0022979999193921685, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_run_cpu": 1.8434476999100298, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_preview_dispatch_passes_bg_sigma": 0.0008625000482425094, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_spot_size_drives_model_scale": 0.0008939000545069575, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_death_detected": 0.001174700097180903, - "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_plugin_sets_mac_env": 0.0010582000249996781, - "spyde/tests/migrated/test_find_vectors_no_numba.py::TestFindVectorsNoNumba::test_package_imports_without_numba": 6.331767899915576, - "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_find_vectors_creates_attached_vectors_tree": 1.2767209999728948, - "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_rejects_non_4d_dataset": 0.655044199898839, - "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_result_window_renders_vectors_and_overlays": 1.3286564000882208, - "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_no_stripe_at_the_boundary_columns": 0.4258961998857558, - "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_the_count_map_does_not_change_with_the_nav_chunking": 1.1673612999729812, - "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_intensity_tracks_raw_disk_amplitude": 0.00567030010279268, - "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_beats_integer": 0.007896400056779385, - "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_is_applied_and_subpixel": 0.007837100070901215, - "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_integer_peak_matches_skimage": 0.008284600102342665, - "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_subpixel_unbiased_on_gaussian": 0.00872540008276701, - "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_finds_all_disks_batched": 0.036411400069482625, - "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_quadratic_fit_recovers_subpixel_centers": 0.042451699962839484, - "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_subpixel_off_returns_integer_peaks": 0.005841000005602837, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_preview_tune_run": 1.4418900999007747, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_stop_removes_preview": 0.5765091999201104, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_mask_overlay_pushed_to_plot": 0.0018587998347356915, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_nxcorr_transform_clim_ceiling_is_fixed": 0.002265600021928549, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_set_params_beamstop_auto_toggles_mask": 0.03462399996351451, - "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_show_transform_compute_and_render": 0.007784500019624829, - "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_dispatch_mark_tutorial_seen_routes": 0.007608399959281087, - "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_first_run_true_by_default": 0.008357600076124072, - "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_idempotent": 0.007921800017356873, - "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_persists": 0.019870699965395033, - "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_restores_persisted_flag_on_restart": 0.024519799975678325, - "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_false_after_marking": 0.019113200018182397, - "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_true": 0.007190800039097667, - "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_staged_handler_registered": 0.0007007000967860222, - "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_transposed_position_is_a_different_position": 0.08749590010847896, - "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_wrong_width_vector_is_refused": 0.06651429983321577, - "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_an_out_of_range_position_is_refused": 0.06313049991149455, - "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_the_key_matches_how_the_display_reads_the_data": 0.0732524999184534, - "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_an_unfitted_position_reads_nothing": 0.07328170002438128, - "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_clear_forgets_everything": 0.06983190006576478, - "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_coverage_counts_positions": 0.07008180010598153, - "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_fitted_to_zero_is_not_the_same_as_unfitted": 0.07253880007192492, - "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_a_spec_hyperspy_cannot_build_still_gets_a_store": 0.013365200022235513, - "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_it_is_a_real_hyperspy_model": 0.08301880001090467, - "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_parameter_order_is_the_engines_column_order": 0.0719856999348849, - "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_values_reach_the_parameter_maps_on_save": 0.11356890003662556, - "spyde/tests/migrated/test_fit_store.py::TestMaps::test_a_fitted_position_becomes_finite": 0.06183059990871698, - "spyde/tests/migrated/test_fit_store.py::TestMaps::test_every_map_starts_empty": 0.06270909996237606, - "spyde/tests/migrated/test_fit_store.py::TestMaps::test_the_area_map_tracks_the_amplitude": 0.06330760009586811, - "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_a_stored_model_survives_a_save_and_reload": 0.30645340017508715, - "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_an_unfitted_position_stays_unfitted_across_the_round_trip": 0.2751016999827698, - "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_the_names_are_listed": 0.07067260006442666, - "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_a_wrong_width_scan_is_refused": 0.07533399993553758, - "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_fills_every_position": 0.07990359992254525, - "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_lands_where_the_display_looks": 0.06616199994459748, - "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_values_array_round_trips": 0.08006540010683239, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_poor_position_is_remembered_and_flagged": 0.12061300000641495, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_records_every_converged_position": 0.12545219995081425, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_reports_its_coverage": 0.12423529999796301, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_navigating_after_a_run_recalls_instead_of_refitting": 0.11819750000722706, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_refitting_a_position_clears_its_poor_flag": 0.13134350010659546, - "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_the_store_is_indexed_like_the_display": 0.12081849994137883, - "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_off_leaves_the_model_alone": 0.1196353998966515, - "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_on_fits_an_unvisited_position": 0.14379470003768802, - "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_every_navigation_path_answers": 0.12402240000665188, - "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_recalls_before_it_refits": 0.1248757999856025, - "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_with_no_model_does_nothing": 0.0732465999899432, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_background_gets_widgets_on_the_plot": 0.11909169994760305, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_nonsense_drag_leaves_the_model_alone": 0.10781220009084791, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_anchors_follow_a_parameter_edit": 0.12341200013179332, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Exponential]": 0.11819309997372329, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Offset]": 0.11958929989486933, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Polynomial]": 0.13235689990688115, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[PowerLaw]": 0.12580240005627275, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[Exponential]": 0.11054410017095506, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[PowerLaw]": 0.11445999995339662, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_background_is_not_seeded_onto_a_peak": 0.0012023999588564038, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_peak_is_not_treated_as_a_background": 0.0008728000102564692, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_power_law_keeps_hyperspys_origin_when_it_can": 0.0011771999998018146, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Exponential]": 0.001618600101210177, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Offset]": 0.0013902001082897186, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Polynomial]": 0.001730700139887631, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[PowerLaw]": 0.001961899921298027, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_adding_a_background_puts_its_handles_on_the_curve": 0.8935482999077067, - "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_flat_data_cannot_fix_an_exponential": 0.0011319998884573579, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_a_bad_edit_does_not_kill_the_wizard": 0.15627260005567223, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_add_component_appears_in_the_state": 0.14566799998283386, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_components_are_seeded_onto_the_current_axis": 0.14985069981776178, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_remove_component": 0.18170670000836253, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_can_fix_a_parameter": 0.179011799977161, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_updates_the_model": 0.14644789998419583, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_two_of_a_kind_get_distinct_names": 0.2931461001280695, - "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_unknown_component_is_reported_not_added": 0.07567829999607056, - "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_every_offered_component_previews": 0.00397939991671592, - "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_peak_shapes_are_actually_peaks": 0.000862100045196712, - "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_previews_are_normalised_and_finite": 0.0008816999616101384, - "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_makes_one_tree_with_a_view_per_component": 0.30420240003149956, - "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_without_a_fit_is_refused": 0.17029339994769543, - "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_area_tracks_the_amplitude": 0.2542978998972103, - "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_one_map_per_component_shaped_to_the_scan": 0.14334539999254048, - "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_a_dead_component_reads_as_dead": 0.2833144998876378, - "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_share_is_relative_peak_height": 0.2630970999598503, - "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_the_state_carries_it": 0.1543406001292169, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_drag_event_carries_the_widget_on_event_source": 0.16737149993423373, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_gaussians_amplitude_is_an_area_not_a_height": 0.0007071000291034579, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_height_parameterised_component_is_left_alone": 0.0006806000601500273, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_reentrant_drag_is_guarded": 0.1570277001010254, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_an_unknown_component_is_ignored": 0.150358899962157, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_dragging_invalidates_a_previous_fit": 0.14508419996127486, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_drag_target_names_real_parameters": 0.10299249994568527, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_offered_component_has_handles": 0.002839800203219056, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_height_and_amplitude_round_trip": 0.0007866999367251992, - "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_width_drag_keeps_the_peak_height": 0.17035350005608052, - "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_does_not_emit_state": 0.15020550007466227, - "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_still_updates_the_model": 0.14710659987758845, - "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_the_release_emits_state": 0.1655559999635443, - "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_does_not_produce_a_scan_result": 0.13204399985261261, - "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_fits_only_the_displayed_spectrum": 0.26163540000561625, - "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_refuses_with_no_components": 0.07903999998234212, - "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_reports_whether_it_converged": 0.1675102998269722, - "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_writes_the_result_back_into_the_model": 0.1479156999848783, - "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_does_not_silently_use_the_navigation_mean": 0.07609509991016239, - "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_fit_current_matches_the_displayed_pixel": 0.24758959980681539, - "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_ignores_a_stale_shape": 0.07262490002904087, - "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_uses_the_painted_spectrum": 0.07434099982492626, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_live_drag_still_does_not_re_send_the_model": 0.14749160001520067, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_real_drag_still_discards_it": 0.14550350001081824, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_moving_the_handles_does_not_discard_the_fit": 0.14816089998930693, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_handle_being_dragged_is_not_written_back": 0.14563240006100386, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_point_tracks_a_live_width_drag": 0.15979950013570487, - "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_range_band_tracks_a_live_point_drag": 0.13705090014263988, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_tears_the_wizard_down": 0.0870150001719594, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_without_open_does_not_raise": 0.048432999989017844, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_double_fire_leaves_exactly_one_controller": 0.09425350010860711, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_creates_a_wizard_and_sends_state": 0.269784800009802, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_sends_the_component_palette": 0.41634049999993294, - "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_reopen_without_close_is_idempotent": 0.0812076999573037, - "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_a_parameter_edit_does_not_rebuild_the_handles": 0.1530437001492828, - "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_editing_a_parameter_moves_its_handle": 0.14301400003023446, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_real_session_exposes_a_position": 0.07536000001709908, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_wrong_length_vector_is_refused": 0.13191469991579652, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_an_unvisited_position_recalls_nothing": 0.11940839991439134, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_changing_the_model_clears_the_store": 0.21215749986004084, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_no_selector_means_no_position": 0.0812847000779584, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_reads_the_position_from_the_selector": 0.07178500003647059, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_remembers_and_recalls_per_position": 0.12087230000179261, - "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_the_store_survives_close_and_reopen": 0.1650439000222832, - "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_reopening_reports_the_restored_model": 0.18319290003273636, - "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_fit_survives_close_and_reopen": 0.19894499995280057, - "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_lives_on_the_tree_not_the_controller": 0.14647889998741448, - "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_survives_close_and_reopen": 0.2024009000742808, - "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_fits_every_position": 0.23301190009806305, - "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_without_components_is_refused": 0.10697399999480695, - "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_a_polynomial_keeps_its_order": 0.01861680008005351, - "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_each_caller_gets_its_own_spec": 0.0009059000294655561, - "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_background_wizard_shares_the_cache": 0.22467430005781353, - "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_catalogue_is_cached_per_axis": 0.0044188001193106174, - "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_prototype_is_shared": 0.0007667000172659755, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_a_fitted_position_fills_one_pixel": 0.16125290002673864, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_closing_the_caret_closes_the_maps_window": 0.13846950011793524, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_committed_tree_is_NOT_closed_with_the_caret": 0.1929463999113068, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_exist_before_anything_is_fitted": 0.13900410011410713, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_include_chi_squared": 0.14422919997014105, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_store_survives_the_caret": 0.12312280002515763, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_ONE_maps_window_refreshed_in_place": 0.14881590008735657, - "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_one_map_per_component": 0.24926150019746274, - "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_every_staged_handler_is_registered": 0.000703799887560308, - "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_fit_is_offered_on_1d_plots_only": 0.0007319001015275717, - "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_the_parameter_schema_resolves": 0.0006933001568540931, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_background_is_not_bounded_to_the_axis": 0.0013266999740153551, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_co_centred_pair_is_still_recovered": 0.16160579991992563, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_peak_cannot_wander_off_the_data": 0.0008921001572161913, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_separated_peaks_are_actually_recovered": 0.08611109992489219, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_the_pair_still_straddles_the_seed": 0.24126670008990914, - "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_two_of_a_kind_do_not_share_a_centre": 0.24044150009285659, - "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_each_row_gets_its_own_surface": 0.001886300160549581, - "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_non_square_images_are_not_transposed": 0.0010642001871019602, - "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_matches_a_ravelled_mgrid": 0.001209000125527382, - "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_shape_and_ordering": 0.0009275000775232911, - "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_a_fixed_parameter_stays_fixed_in_2d": 0.09084059996530414, - "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_bounds_apply_in_2d_too": 0.23184080002829432, - "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_fits_many_images_at_once": 0.28878810012247413, - "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_recovers_the_generating_parameters": 0.0913444000761956, - "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_analytic_gradient_matches_autodiff": 0.17220810009166598, - "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_linear_flag_matches_hyperspy": 0.06637460005003959, - "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_parameter_order_matches_hyperspy": 0.34480249986518174, - "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_values_match_hyperspy": 0.07193610002286732, - "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_gaussian2d_round_trips_through_modelspec": 0.18230010010302067, - "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_the_engine_reports_2d_support": 0.0007472999859601259, - "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_chunked_and_unchunked_agree": 0.2885176999261603, - "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_result_shape_follows_the_navigation_grid": 0.1037771999835968, - "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_cpu_is_always_usable": 0.09644510003272444, - "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_default_device_is_reported": 0.001701400033198297, - "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_env_var_forces_the_device": 0.0020135000813752413, - "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_all_parameters_fixed_is_a_clear_error": 0.048973599914461374, - "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_bounds_are_respected": 0.11355570005252957, - "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_fixed_parameter_is_not_moved": 0.0803858001017943, - "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_clean_data_converges_in_float32": 0.10984219994861633, - "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_matches_multifit": 0.3456738000968471, - "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_stops_early_instead_of_burning_the_budget": 0.12475320009980351, - "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_a_failing_progress_callback_does_not_kill_the_fit": 0.07964889996219426, - "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_axis_length_mismatch_is_caught": 0.051111600012518466, - "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_progress_callback_reports_completion": 0.16264459991361946, - "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_unsupported_component_refuses_rather_than_dropping_it": 0.005342399934306741, - "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_per_position_seeds_are_used": 0.0927580000134185, - "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_seeds_outside_bounds_are_clipped_not_rejected": 0.22595590015407652, - "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_float64_request_is_downcast_not_an_error": 0.00042399996891617775, - "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_agrees_with_cpu_float32": 0.00045789999421685934, - "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_converges": 0.00042890000622719526, - "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_matches_multifit": 0.0004295001272112131, - "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_every_position_converges_on_clean_data": 0.09400769986677915, - "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_parameters_match_hyperspy_multifit": 1.1731033000396565, - "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_power_law_background_matches_multifit": 0.1429950000019744, - "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_recovers_the_truth_it_was_built_from": 0.12380809977184981, - "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_mask_length_mismatch_is_caught": 0.040534600033424795, - "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_masked_channels_do_not_influence_the_fit": 0.2111975000007078, - "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_a_coarser_request_is_honoured": 0.0007542000385001302, - "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float32_tolerances_are_raised_above_epsilon": 0.0007339001167565584, - "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float64_tolerances_are_left_alone": 0.0007470999844372272, - "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_mps_downcasts_float64": 0.0007014999864622951, - "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_other_devices_keep_the_dtype": 0.0007036000024527311, - "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_poisson_weighting_runs_and_stays_sane": 0.10159310000017285, - "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_unknown_weighting_is_rejected": 0.0394983000587672, - "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_a_coarse_sample_seeds_itself": 0.002319999970495701, - "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_always_includes_the_last_index": 0.0023460000520572066, - "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_each_position_maps_to_its_nearest_coarse_sample": 0.0020717999432235956, - "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_samples_the_strided_grid": 0.001500600134022534, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_coarse_pass_gets_a_larger_iteration_budget": 0.15067610004916787, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_converged_coarse_fits_are_propagated": 0.11790189996827394, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_failed_coarse_fits_are_not_propagated": 0.17972990009002388, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_matches_a_cold_fit_on_easy_data": 0.2773183999815956, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_oversized_stride_falls_back_instead_of_wasting_a_pass": 0.09093180019408464, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_plain_fit_reports_no_seeding": 0.11911139998119324, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_recovers_the_truth": 0.15855910012032837, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_reports_how_many_seeds_were_usable": 0.16645949997473508, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_stride_one_degenerates_to_a_plain_fit": 0.09423309983685613, - "spyde/tests/migrated/test_fitting_seeding.py::TestSeedingHelpsWhereColdStartsStruggle::test_improves_convergence_on_a_hard_starting_point": 0.3375388999702409, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_detail_region_upsample": 0.12671500002034009, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_geometry_matches_source": 0.021554300095885992, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_is_tile_backend": 0.011413999949581921, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_mean_matches_numpy": 0.24677900003734976, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_set_array_swaps_source": 0.024965700111351907, - "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_subsample_matches_numpy": 0.0747851999476552, - "spyde/tests/migrated/test_gpu_tile_backend.py::test_gpu_mean_correct_in_subprocess": 5.014744899934158, - "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_keeps_the_threshold_marker": 0.2133347998606041, - "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_moves_the_handles_not_the_bins": 0.19749659998342395, - "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_spans_the_full_range": 0.21710640017408878, - "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_restores_robust_levels_after_a_manual_drag": 0.22922830004245043, - "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_unknown_window_is_a_no_op": 0.23250729998108, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_bulk_is_resolved_across_many_bins": 0.0034058999735862017, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_clipping_never_drops_samples": 0.003041899879463017, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_flat_frame_falls_back_to_full_extent": 0.0007308999774977565, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_tail_does_not_own_the_axis": 0.0034217999782413244, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_the_handles_land_inside_the_drawn_range": 0.0027736000483855605, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_uniform_data_is_not_clipped": 0.001562400022521615, - "spyde/tests/migrated/test_histogram_contrast.py::TestHistogramMessage::test_carries_the_full_extent": 0.20946749998256564, - "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_hex_net": 0.0019918999169021845, - "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_noisy_net_still_fits": 0.0017248999793082476, - "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_random_points_reject": 0.0011849998263642192, - "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_square_net": 0.004164100042544305, - "spyde/tests/migrated/test_index_and_calibrate.py::TestCentering::test_friedel_center_recovered": 0.1650081998668611, - "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_manual_calibration_from_dspacing": 0.1651805000146851, - "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_pipeline_runs_and_flags_consistency": 0.21364540001377463, - "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_anatase_first_reflection": 0.0017061999533325434, - "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_cubic_d_spacing": 0.0017084998544305563, - "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_d_list_descending_unique": 0.002839699969626963, - "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_exact_recovery": 0.005067900056019425, - "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_match_phase_ranks_correct": 0.01964320009574294, - "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_eager_round_trip": 0.00410389993339777, - "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_lazy_round_trip": 0.007980600115843117, - "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_4d_stem_navigator_excludes_playback_buttons": 0.2087596000637859, - "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_movie_navigator_includes_playback_buttons": 1.1351757999509573, - "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_plain_1d_nav_signal_excludes_playback_buttons": 0.560403999988921, - "spyde/tests/migrated/test_insitu_signal_type.py::TestTestHarnessMovieLoaderTypesInSitu::test_movie_root_is_insitu": 0.5634721999522299, - "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_continuous_pokes_are_capped_by_max_wait": 0.305138599826023, - "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_fill_resumes_after_scrub_settles": 0.15442629996687174, - "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_stop_aborts_the_wait_immediately": 0.00181639997754246, - "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_blocks_after_a_poke": 0.20490889996290207, - "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_returns_fast_when_idle": 0.0018713000463321805, - "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_blank_and_non_json_lines_skipped": 0.0037076001754030585, - "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_text_stdin_without_buffer_still_works": 0.003439399995841086, - "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_utf8_non_ascii_labels_decode_intact": 0.007060399861074984, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_attach_ipf_key_registers_one_key_on_the_plot": 0.10210050002206117, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_forces_gpu": 0.030922999838367105, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_html": 0.032440499984659255, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_edge_labels_align_inwards_so_they_do_not_clip": 0.08547279995400459, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_emit_3d_figure_message": 0.03144259995315224, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_ipf_key_overlay_is_an_rgba_image": 0.08137789997272193, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_key_labels_are_fractions_of_the_image": 0.0885581000475213, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_no_ipf_key_figure_is_emitted_any_more": 0.1826945999637246, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_not_capped_at_20000": 0.2022198000922799, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_on_unit_sphere": 0.031072000041604042, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_still_caps_at_absurd_size": 9.114471100037917, - "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_the_key_is_hover_only_by_default": 0.08804180007427931, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_attach_ipf_3d_also_emits_density": 0.19018739997409284, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_build_density_figure_has_mesh": 0.16620310000143945, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_raster_known_region_maps_to_sane_color": 0.12203760002739727, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_uses_raster_not_polygon_mesh": 0.14963450003415346, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_emit_density_message": 0.16418960003647953, - "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_multiphase_builds_one_axis_per_phase": 0.31821130006574094, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_phase_ipf_geometry": 4.13893110002391, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_uses_single_raster_not_polygons": 5.279734600102529, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_lut_alpha_and_orientation": 0.0014420998049899936, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_matches_polygon_cell_position": 4.201306699891575, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_match_correlations_full_length": 13.3985322000226, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_no_circles_returns_none": 5.552603099960834, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_rot_mask_from_circles_restricts": 4.4786344000604, - "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_update_panels_pushes_image_not_facecolors": 5.563005900010467, - "spyde/tests/migrated/test_ipf_refine.py::TestRefineController::test_controller_recompute_and_double_click_toggle": 5.656120300060138, - "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_bare_window_direction_reaches_the_controller": 1.087321599945426, - "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_map_window_direction_forwards_to_the_explorer": 1.1709356998326257, - "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_aims_the_camera_down_the_vector": 0.0016235002549365163, - "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_returns_degrees_in_range": 0.000977999996393919, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_close_is_idempotent_and_clears_the_tree": 0.522624499979429, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_opens_a_separate_window_with_all_four_views": 0.5626054999884218, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_reopening_reuses_the_same_window": 1.1610713999252766, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_set_direction_recolours_every_view": 1.9755826999899, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_does_not_re_emit_figures": 0.5549120000796393, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_marks_and_rotates": 0.519899099948816, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_moves_the_2d_marker": 0.5861889999359846, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_window_is_titled": 0.5387977999635041, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_figure_builds": 0.08488149999175221, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_is_a_surface_not_a_point_list": 0.053233099984936416, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_lies_on_the_unit_sphere": 0.05567550007253885, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_every_vertex_is_finite": 0.0547190000070259, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_painted_cells_are_coloured_by_density": 0.05540319997817278, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_figure_has_a_marker_per_phase": 0.08457629999611527, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_subsamples_a_huge_map": 0.19998870010022074, - "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_the_sector_is_masked_in_alpha": 0.053434900124557316, - "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_attach_projections_registers_three_chips": 0.18067790009081364, - "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_projection_maps_actually_differ": 0.05145210004411638, - "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_register_views_append_merges": 0.0007103998214006424, - "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_attach_without_a_session_keeps_the_legacy_layout": 0.17829879990313202, - "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_ebsd_finalize_builds_the_two_windows_and_keeps_its_chips": 1.6724783999379724, - "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.ebsd_action]": 0.002162400051020086, - "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.orientation_action]": 0.0019926000386476517, - "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.vector_orientation_om]": 0.008463799953460693, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_lazy_signal_flows_through_add_signal_without_client": 0.06032090005464852, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_opens_the_file_lazily": 0.016057100030593574, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_takes_the_first_of_a_multi_signal_file": 0.021063199965283275, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_wraps_an_eager_reader": 0.017167599988169968, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_converts_eager_signal": 0.018444799934513867, - "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_passthrough_when_already_lazy": 0.014536600094288588, - "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_add_signal_returns_without_blocking_on_nav_compute": 0.054201999912038445, - "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_client_property_reads_live_from_dask_manager": 0.07807579997461289, - "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_navigator_fills_in_background_without_client": 1.4715347000164911, - "spyde/tests/migrated/test_lifecycle.py::TestGenerationGuard::test_bump_and_is_current": 0.0008171000517904758, - "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_none_shm_is_noop": 0.0017037999350577593, - "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_polls_until_stopped": 0.385939700063318, - "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_auto_level_without_levels": 0.0018885000608861446, - "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_with_levels_locked": 0.001817299984395504, - "spyde/tests/migrated/test_lifecycle.py::TestProgressEmitter::test_throttles_and_always_emits_final": 0.0021991999819874763, - "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_factory_failure_leaves_none": 0.0017631000373512506, - "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_none_factory_just_removes": 0.0017726999940350652, - "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_removes_old_and_sets_new": 0.0020094000501558185, - "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_falls_back_to_any_tree": 0.0007093999302014709, - "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_prefers_plot_tree": 0.0007165001006796956, - "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_error_calls_on_error": 0.0025892999256029725, - "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_without_session": 0.000763599993661046, - "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_marshals_on_done_to_loop_thread": 0.005472899996675551, - "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_worker_error_reaches_on_error": 0.00645089999306947, - "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_fires_then_once_vectors_attach": 0.6372589999809861, - "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_no_loop_returns_false": 0.0007514999015256763, - "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_nothing_running_errors_after_grace": 0.33450180012732744, - "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_all_nan_buffer_is_painted_once": 0.16898459987714887, - "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_unchanged_buffer_is_painted_once": 0.1699042998952791, - "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_real_changes_still_paint": 0.12720789993181825, - "spyde/tests/migrated/test_live_overlay.py::test_compute_error_does_not_propagate": 0.0017723998753353953, - "spyde/tests/migrated/test_live_overlay.py::test_stop_is_idempotent_and_halts_worker": 0.05338259995914996, - "spyde/tests/migrated/test_live_overlay.py::test_sync_mode_runs_inline_on_caller": 0.0018069997895509005, - "spyde/tests/migrated/test_live_overlay.py::test_thread_mode_is_offthread_singleflight_latest_wins": 0.04450449999421835, - "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_crop_resolves_local": 0.44681350013706833, - "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_rebin_resolves_local": 0.4620842000003904, - "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_flat_field_resolves_opaque": 0.6868457001401111, - "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_per_pattern_resolves_local": 0.6002927999943495, - "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_manual_constant_shift_resolves_local": 0.5899760000174865, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_chain_of_local_tags_resolves_local": 0.0016295999521389604, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_explicit_opaque_ancestor_poisons_a_locally_tagged_descendant": 0.0016219000099226832, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_memoized_result_does_not_change_after_mutation": 0.0019229999743402004, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_resolving_a_descendant_also_memoizes_ancestors": 0.0018983001355081797, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_root_is_always_local": 0.001922600087709725, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_ancestor_poisons_a_locally_tagged_descendant": 0.0016368000069633126, - "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_node_defaults_opaque": 0.0016141000669449568, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_axes_full_length_match_full_frame": 0.2430929000256583, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_clim_passed_atomically": 0.006779700051993132, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_sent_full_res": 0.28303709998726845, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_uses_tile_auto": 0.2807064999360591, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_navigator_frame_full_res_tile_false": 0.2647602998185903, - "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_small_frame_sent_full_and_auto": 0.005866599967703223, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_exception_traceback_included": 0.0016978000057861209, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_handler_level_gates_records": 0.0011256999569013715, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_record_becomes_log_message": 0.0013398999581113458, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_reentrancy_guard_blocks_recursion": 0.0009137999732047319, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_ring_buffer_bounded": 0.0014044001000002027, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_spyde_info_passes": 0.0010023999493569136, - "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_thirdparty_info_is_filtered_but_warning_passes": 0.0011338000185787678, - "spyde/tests/migrated/test_log_stream.py::TestInstall::test_install_is_idempotent": 0.0008281999034807086, - "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_level_changes_handler_and_root": 0.0008111001225188375, - "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_log_level_staged_handler_backfills": 0.001043599913828075, - "spyde/tests/migrated/test_masks.py::TestVirtualImageNonBlackOnCalibratedData::test_vi_is_nonzero_with_calibrated_signal_axes": 0.005739000043831766, - "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_annular_mask_is_a_ring_on_calibrated_axes": 0.0031287999590858817, - "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_disk_mask_is_nonempty_on_calibrated_axes": 0.009623800055123866, - "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_mask_is_calibration_invariant": 0.013301300001330674, - "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_offcentre_disk_lands_where_the_widget_is": 0.003143099951557815, - "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_rectangle_mask_on_calibrated_axes": 0.0031940999906510115, - "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_256_dp_buffer_is_about_1mb": 0.002874799887649715, - "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_buffer_never_256mb": 0.002918599988333881, - "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_fallback_is_modest": 0.0007110999431461096, - "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_edit_survives_zspy_save_reload": 0.8075512000359595, - "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_emit_carries_raw_editable_map": 0.2175474000396207, - "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_metadata_reemit_reaches_captured_messages": 0.20860240003094077, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_non_finite_numbers_rejected": 0.350564900203608, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_float_writes_back_and_re_emits": 0.3716384000144899, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_invalid_number_ignored": 0.33071629982441664, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_no_plot_is_noop": 0.009448099881410599, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_readonly_derived_field_ignored": 0.3497436000034213, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_string_field": 0.3426640999969095, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_unknown_cell_ignored": 0.33906629984267056, - "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_units_suffixed_display_string_rejected": 0.344287300016731, - "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_bundled": 0.008170300163328648, - "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_unknown_id": 0.001922599971294403, - "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_is_cached_bundled": 0.001909599988721311, - "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_resolve_weights_checks_sha": 0.020725499955005944, - "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_sha256_verify": 0.038821000023745, - "spyde/tests/migrated/test_model_spec.py::TestCopy::test_copy_is_deep": 0.04272770008537918, - "spyde/tests/migrated/test_model_spec.py::TestCopy::test_lookup_errors_name_what_is_available": 0.040744900004938245, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_all_channels_active_is_stored_as_none": 0.04575970000587404, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_a_restricted_signal_range": 0.04677559994161129, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_bounds_including_absent_ones": 0.04556130000855774, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_components_and_kinds": 0.05588220001664013, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_free_flags": 0.047906799940392375, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_parameter_values": 0.04708950000349432, - "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_the_linear_flag": 0.043447199976071715, - "spyde/tests/migrated/test_model_spec.py::TestJson::test_channel_mask_survives_as_ranges": 0.03819740004837513, - "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_is_json_serialisable": 0.040657199919223785, - "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_round_trip": 0.03847470006439835, - "spyde/tests/migrated/test_model_spec.py::TestJson::test_two_disjoint_ranges_survive": 0.0010474000591784716, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_component_slices_isolate_each_component": 0.03686039999593049, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_inactive_components_occupy_no_columns": 0.038611800177022815, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_masks_line_up_with_values": 0.03799270000308752, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_parameter_names_follow_component_then_parameter_order": 0.041901699965819716, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_is_the_inverse_of_flat_values": 0.041728299926035106, - "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_rejects_the_wrong_width": 0.04184680001344532, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_bounds_are_set_before_values": 0.03860299987718463, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_inactive_component_survives_the_round_trip": 0.08113150007557124, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_replaces_any_prepopulated_components": 0.009619900025427341, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_bounds_and_free_flags": 0.09663219994399697, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_kinds_and_values": 0.09038139996118844, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_the_signal_range": 0.09086640004534274, - "spyde/tests/migrated/test_model_spec.py::TestToModel::test_unknown_kind_is_a_clear_error": 0.010010299971327186, - "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_keeps_its_subshell_identity": 0.0016612999606877565, - "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_onsets_survive": 0.0016553000314161181, - "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips": 0.0017315001459792256, - "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips_through_json": 0.001654599909670651, - "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_high_order_coefficients_are_not_silently_dropped": 0.04759620002005249, - "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_json": 0.039157899911515415, - "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[1]": 0.05528079986106604, - "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[2]": 0.0265474000480026, - "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[6]": 0.051703200209885836, - "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_components_without_init_args_are_unaffected": 0.07913369999732822, - "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_missing_init_args_give_an_actionable_error": 0.0016466999659314752, - "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_empty_movie_cell_is_placeholder": 0.22945319989230484, - "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_open_emits_edit_open": 0.2874037000583485, - "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_seeded_from_plot": 0.2561720999656245, - "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_set_movie_source": 0.2490185999777168, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_close_drops_session": 0.22750740009360015, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_open_emits_state_shape": 0.32250839995685965, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_clamps_to_range": 0.26827130001038313, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_drives_real_navigator": 0.288007500115782, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_clamps_time_range": 0.234498200006783, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_half_open_clim_does_not_raise": 0.23928019998129457, - "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_persists_onto_spec": 0.2441950999200344, - "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_gif_emits_done_and_bakes_poster": 0.4047524998895824, - "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_respects_crop": 0.3117954999906942, - "spyde/tests/migrated/test_movie_block.py::TestExport::test_freeze_grows_frame_count": 0.3696227999171242, - "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_export_never_computes_full_array": 0.3225107998587191, - "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_scrub_never_computes_full_array": 0.2867103999014944, - "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_remove_movie_cell_tears_down_widgets": 0.2500923000043258, - "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_reopen_after_close_restores_widgets_from_persisted_spec": 0.24351860012393445, - "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_close_tears_down_widgets": 0.2321316001471132, - "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_new_tears_down_widgets_but_keeps_cell_persistence": 0.23602390009909868, - "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_view_outside_editor_after_close_shows_no_overlays": 0.27666279999539256, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_add_text_overlay_from_1d_window": 0.2766398001695052, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_annotation_widgets_drag_persists_to_spec": 0.26470080006401986, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_offsets_annotation_coordinates_in_export": 0.35652390005998313, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_widget_on_figure_persists": 0.2867151000536978, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_zooms_the_live_figure": 0.24995840014889836, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_overlay_image_composited_in_export": 0.560057699913159, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_play_emits_frames_and_stops": 1.063471999950707, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_render_params_apply_to_live_figure": 0.24216600006911904, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_speed_segment_slows_the_export": 0.39897400001063943, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_static_2d_overlay_image_composites": 0.3791911001317203, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_live_value_on_figure": 0.3260229001753032, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_value_in_export": 0.3698057000292465, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_time_gated_annotation_shows_only_in_window": 0.2954313998343423, - "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_tune_persists_annotations_and_freezes": 0.2463465001201257, - "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_keeps_using_same_plot_as_outside_editor": 1.2004074999131262, - "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_routes_through_gpu_tile": 1.2233756000641733, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_2d_nav_4dstem_still_spans_signal": 0.012666599941439927, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_4dstem_whole_signal_small_nav_block_left_alone": 0.013061000034213066, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_explicit_nav_chunk_override_is_honoured": 0.011242300039157271, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_frame_gets_one_frame_per_chunk": 0.019692700006999075, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_movie_gets_one_frame_per_chunk": 0.01531970000360161, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_medium_frame_byte_target_on_4dstem": 0.02092160005122423, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_movie_whole_signal_multi_frame_block_is_recut_to_one": 0.011276500066742301, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_non_navigated_2d_image_returns_none": 0.009420400019735098, - "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_small_dp_packs_many_but_capped": 0.011746499920263886, - "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_no_bare_hs_load_in_the_file_session": 0.009410300059244037, - "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_open_lazily_can_take_chunks": 0.0018492999952286482, - "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_the_examples_path_aligns_too": 0.0033462001010775566, - "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_a_reader_that_rejects_chunks_still_loads": 0.06662130006588995, - "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_it_leaves_a_good_chunking_alone": 0.049226999981328845, - "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_mrc_comes_back_with_whole_signal_chunks": 0.05803339998237789, - "spyde/tests/migrated/test_movie_chunking.py::TestMovieFixture::test_movie_opens_with_1d_time_navigator": 0.21632500004488975, - "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_4dstem_scan_still_prompts": 0.01279080007225275, - "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_large_image_frames_skip_prompt_even_if_axis_unnamed": 0.010190899949520826, - "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_small_dp_stack_still_prompts": 0.023252900107763708, - "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_time_axis_movie_skips_prompt": 0.01127339992672205, - "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_z_stack_skips_prompt": 0.011945900041610003, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_cropped_view_scrubs": 0.03372289997059852, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_rebinned_view_scrubs": 0.0411796000553295, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadFallThrough::test_eager_falls_through": 0.0036340999649837613, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_region_block_bounded_to_block": 0.060339399962686, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_single_frame_on_monolithic_chunk_is_bounded": 0.032926199957728386, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_large_region_stays_bounded": 0.13251180003862828, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_mean_matches_get_index": 0.037168300012126565, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_rounds_integer_source": 0.013473699917085469, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_4dstem_diffraction_pattern": 0.011526500107720494, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_matches_get_index_movie": 0.028257399913854897, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_movie_single_frame": 0.0343174000736326, - "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_out_of_range_index_read_raises_to_none": 0.013211200130172074, - "spyde/tests/migrated/test_movie_export.py::TestAnnotations::test_rect_only_in_frames_3_to_6": 0.4393298999639228, - "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_before_run_raises_before_probe_and_no_output": 0.024871100205928087, - "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_leaves_no_partial_file": 0.09207320003770292, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_downsample_dimensions_even_cropped": 0.18983020004816353, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_gif_decodable": 0.1625340001191944, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_mp4_exists_and_frame_count": 0.2760119999293238, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_odd_downsample_even_crop": 0.24206070008222014, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_stride": 0.23585170006845146, - "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_time_range": 0.29122170014306903, - "spyde/tests/migrated/test_movie_export.py::TestFfmpegMissing::test_ffmpeg_ok_false_when_probe_raises": 0.0022299998672679067, - "spyde/tests/migrated/test_movie_export.py::TestLUT::test_apply_lut_non_blank_and_differs": 0.002006299910135567, - "spyde/tests/migrated/test_movie_export.py::TestLUT::test_downsample_halves": 0.0010430000256747007, - "spyde/tests/migrated/test_movie_export.py::TestLUT::test_lut_shape_and_range": 0.0013339999131858349, - "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_never_computes_full_array": 0.32527819997631013, - "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_read_frame_is_single_frame": 0.024459799868054688, - "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_fit_frame_pads_and_crops": 0.002266500028781593, - "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_smaller_tail_frame_is_letterbox_padded": 0.329087300109677, - "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_inset_changes_pixels_in_inset_region": 0.5338848999235779, - "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_resample_clamps": 0.0023608000483363867, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_fps_key_preferred": 0.011521499953232706, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_key_wins_over_time_axis": 0.01186810014769435, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_fps_derived_from_time_axis": 0.014145799912512302, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_group_present": 0.015199100016616285, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_microsecond_units_converted": 0.012253300053998828, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_minute_units_converted": 0.011523199966177344, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_ms_units_converted": 0.012317700078710914, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_non_time_axis_shows_placeholder": 0.011457999935373664, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_unknown_time_unit_does_not_derive": 0.01754979998804629, - "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_zero_scale_does_not_divide": 0.011431699967943132, - "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_empty_spec_tolerant": 0.0008697999874129891, - "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_partial_dict_tolerant": 0.0008172000525519252, - "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_to_from_yaml_roundtrips": 0.010634800069965422, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_full_roundtrip": 0.01500120002310723, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_marker_is_invisible_comment": 0.0013183000264689326, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_older_report_without_movies_still_loads": 0.0016586000565439463, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_placeholder_movie_survives_without_poster": 0.021843900089152157, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_schema_version_unchanged": 0.0008055999642238021, - "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_zip_layout": 0.03095199994277209, - "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_latest_center_wins": 0.02530300011858344, - "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_reads_neighbours_around_center": 0.025559800094924867, - "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_stays_in_bounds": 0.024680200032889843, - "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_generate_library_accepts_multiple_cifs": 5.931662100018002, - "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_two_phase_map_and_2d_ipf": 10.946104699978605, - "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_navigator_reports_image_aspect": 0.20854359993245453, - "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_signal_figure_has_no_aspect": 0.22382549999747425, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_current_data_not_set_to_future": 0.023781799944117665, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_failed_read_releases_slot": 0.02137090009637177, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_int_region_mean_is_rounded": 0.025350699899718165, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_region_mean_matches_numpy": 0.025417899945750833, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_settle_flag_requests_full_res": 0.028517500148154795, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_single_frame_paints_correct_data": 0.020346500095911324, - "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_supersede_cancels_prior_future": 0.02804100012872368, - "spyde/tests/migrated/test_nav_async_cancel.py::TestComputeBackendShutdownGuard::test_backend_none_after_shutdown_no_executor_recreate": 0.009297800017520785, - "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_nav_pool_is_serial": 0.0007839001482352614, - "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_sequence_advances_per_submission": 0.027105300105176866, - "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_stale_frame_does_not_paint_over_a_newer_one": 1.2120293001644313, - "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_float_region_mean_is_not_rounded": 0.021494299871847034, - "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_integer_region_mean_is_rounded_to_source_dtype": 0.034655800089240074, - "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_result_is_never_a_future": 0.012445700005628169, - "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_single_point_returns_exact_frame_as_ndarray": 0.01916810020338744, - "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_builds_time_and_spatial_selectors": 0.09841440001036972, - "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_chain_refire_forces_downstream": 0.10021950001828372, - "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_composed_index_includes_and_tracks_time": 0.09347909991629422, - "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_spatial_upstream_resolves_to_time_composite": 0.0958474000217393, - "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_does_not_hand_over_near_the_end": 0.0007527000270783901, - "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_hands_over_once_the_cluster_appears": 0.0008008000440895557, - "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_never_hands_over_without_a_cluster": 0.000786700053140521, - "spyde/tests/migrated/test_nav_cluster_handover.py::TestWiring::test_the_fill_loop_actually_contains_the_handover": 0.007267700042575598, - "spyde/tests/migrated/test_nav_orientation.py::TestNavOrientation::test_crosshair_selects_data_iy_ix": 0.46479639993049204, - "spyde/tests/migrated/test_nav_paint_decouple.py::TestEnqueuePaint::test_enqueue_sets_current_data_immediately": 0.01199110015295446, - "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_newest_wins_drops_stale_paint": 0.5051746000535786, - "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_paint_happens_off_caller_thread": 0.013711799983866513, - "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_slow_paint_does_not_block_submitter": 0.003927799989469349, - "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_crosshair_selects_frame_while_nav_still_computing": 2.3005977000575513, - "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_fills_progressively_without_cluster": 0.6851096998434514, - "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_has_no_holes_when_complete": 0.6914598000003025, - "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_windows_and_crosshair_ready_before_nav_image": 0.08274869993329048, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestFourDNotRegressed::test_4d_still_uses_the_single_navigator_path": 0.6381012002239004, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_both_navigators_fill_from_one_pass": 0.7691568001173437, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_child_navigator_fills_progressively": 0.004002099856734276, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_array_is_what_the_fill_computes": 0.14063279994297773, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_signal_is_committed_in_ram": 0.7670301998732612, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_partial_plane_never_clobbers_a_complete_frame": 0.0016424001660197973, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_reduce_deep_nav_masks_incomplete_planes": 0.0013852000702172518, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_sidecar_round_trip_skips_the_compute_entirely": 0.9107631000224501, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_move_reads_the_committed_array": 0.7986159999854863, - "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_navigator_never_shows_a_partial_sum": 0.7479342001024634, - "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_distributed_mode_does_not_use_the_client": 0.013721400056965649, - "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_future_is_cancellable": 0.015902600018307567, - "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_shutdown_is_idempotent": 0.0009469999931752682, - "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_threaded_mode_uses_the_existing_executor": 0.016606700024567544, - "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_crossing_chunk_boundary_decodes_once_then_dwells": 0.4163245998788625, - "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_dwell_in_chunk_is_fast_no_redecode": 0.6202622000128031, - "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[1.0-0.0]": 0.6912645000265911, - "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[2.5-10.0]": 0.6755746001144871, - "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[3.0-0.0]": 0.6859942000592127, - "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_scaled_navigator_selects_correct_diffraction_pattern": 1.0790787000441924, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_4d_load_emits_prompt_and_does_not_open": 0.02359119988977909, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_applies_step_size_and_opens": 0.4885391001589596, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_reshapes_flat_stack_lazily": 0.5156240998767316, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_with_wrong_frame_count_falls_back": 0.5203747999621555, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_open_file_emits_busy_then_clears": 0.1487794000422582, - "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_plain_2d_image_does_not_prompt": 0.030755599960684776, - "spyde/tests/migrated/test_nav_sidecar.py::TestNavFillDeferral::test_fill_waits_for_first_signal_frame": 1.0471825001295656, - "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_fill_saves_sidecar_and_reopen_skips_compute": 0.7628742000088096, - "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_no_sidecar_for_pseudo_paths": 0.07081350008957088, - "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_override_navigator_never_uses_sidecar": 0.11004960001446307, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_1d_movie_navigator": 0.021679299999959767, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_missing_or_corrupt_sidecar": 0.01827430003322661, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_modified_source_invalidates": 0.032502499991096556, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_partial_fill_never_cached": 0.004959999932907522, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_save_then_load": 0.0383697000797838, - "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_shape_mismatch_misses": 0.025953899952583015, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_cold_huge_frame_is_expensive": 0.0025209999876096845, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_small_frame_is_cheap": 0.0025313999503850937, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_derived_huge_frame_stays_cheap": 1.2702506999485195, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_huge_frame_resident_in_the_array_cache_is_cheap": 0.0025294999359175563, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_never_computes": 0.0031432999530807137, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_a_few_points_stays_cheap": 0.0024634000146761537, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_UNCACHED_points_is_expensive_even_when_small": 0.0024941001320257783, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_points_of_BIG_frames_is_expensive": 0.0036165998317301273, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_medium_region_below_async_cap_is_cheap": 0.0026039000367745757, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_region_by_bytes_is_expensive": 0.0034616999328136444, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_small_region_is_cheap": 0.0032406001118943095, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_cropped_view_single_point_is_cheap_now": 0.001512099988758564, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_raw_movie_single_point_is_cheap": 0.0010957999620586634, - "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_rebinned_view_single_point_is_cheap_now": 0.0017710999818518758, - "spyde/tests/migrated/test_navigator_race.py::test_latest_position_wins_under_burst": 0.06328839994966984, - "spyde/tests/migrated/test_navigator_race.py::test_newer_submission_coalesces_older_one": 0.06377749994862825, - "spyde/tests/migrated/test_navigator_race.py::test_updates_run_serially_never_concurrently": 0.0624526001047343, - "spyde/tests/migrated/test_neural_batch_memory.py::TestNeuralBatchMemory::test_peak_memory_scales_with_batch_not_stack_size": 9.579261699924245, - "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_batch_matches_single": 5.350641700089909, - "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_bundled_model_loads": 4.500292699900456, - "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_detect_localises_planted_spots": 5.230978699983098, - "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_fallback": 4.445225299918093, - "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_upgrade_merge": 4.159515600069426, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_clear_is_a_noop_without_a_crosshair": 0.37527550000231713, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_drag_release_drag_again": 0.37094009993597865, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_navigator_plot_edits_navigation_axes": 0.37717270001303405, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_node_switch_clears_the_crosshair": 0.3827047001104802, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_refused_toggle_reports_off": 0.38726210000459105, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_stable_across_repeated_moves": 0.36302509997040033, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_starts_at_current_offset_no_change_until_drag": 0.3735494000138715, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_emits_pick_state": 0.37296649999916553, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_off_removes_crosshair": 0.37660519999917597, - "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_on_sets_offset_so_crosshair_is_origin": 0.3767742000054568, - "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_returns_single_2d_frame_from_5d": 0.0008803998352959752, - "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_still_works_for_4d": 0.0008229999803006649, - "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_only_spatial_pair_is_transposed": 0.0008555001113563776, - "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_overlay_helpers_split_lead_and_spatial": 0.0007816000143066049, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_fewer_than_two_files_errors": 0.020008399966172874, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_mismatched_shapes_cropped_with_warning": 0.19843650003895164, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_per_file_scan_calibration_carried_over": 0.2340767999412492, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_signal_type_carried_over": 0.20720300008542836, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stack_axis_is_generic_index": 0.2793877999065444, - "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stacks_two_4d_into_5d_lazy": 0.20766689989250153, - "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_load_cif_library_refine": 4.300532300025225, - "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_template_spots_match_pyxem": 0.2854464000556618, - "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_chunked_equals_single_chunk": 16.981118100113235, - "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_live_shm_rgb_written": 9.330549599952064, - "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_never_computes_full_dataset": 9.495856799883768, - "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_stopped_flag_returns_none": 7.921564800082706, - "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_phase_recovered": 9.32342020003125, - "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_template_tables_match_get_simulation": 0.4213521999772638, - "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_correlation_sorted_and_positive": 9.109316400135867, - "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_inplane_delta": 8.319886999903247, - "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_rows_and_quats_match_pyxem": 55.99108930013608, - "spyde/tests/migrated/test_orientation_compute.py::TestResolveQuaternions::test_identity_roundtrip": 0.36254150001332164, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_color_map_directions_differ": 0.03478830005042255, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_correlation_and_phase_maps": 0.0011355000315234065, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_color_map": 0.02039860002696514, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_matches_direct_orix": 0.009044700185768306, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_counts_and_subsample": 0.012411799980327487, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_multiphase_partition": 0.010013900115154684, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_encodes_inplane_rotation": 0.011325599974952638, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_geometry": 0.009358800016343594, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_save_load_roundtrip": 0.07947450003121048, - "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_shapes_and_props": 0.0011103000724688172, - "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_identity_rotation_projects_z_to_origin": 0.005944600095972419, - "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_triangle_outline_nonempty": 0.0188831000123173, - "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_xy_inside_sector_bounds": 0.02308479999192059, - "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_orientation_end_to_end_on_lazy_data": 9.431987699936144, - "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_overlay_attaches_and_draws_template_spots": 9.17346040008124, - "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_overlay_hook_registered_and_updates": 8.283311300096102, - "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_entry_rejects_missing_cif": 0.5585014000535011, - "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_orientation_builds_ipf_window_and_attaches_map": 2.9140549999428913, - "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_source_overlay_attaches_before_the_batch": 0.4561360999941826, - "spyde/tests/migrated/test_orientation_port.py::test_plot_renders_rgb_image": 0.002044200082309544, - "spyde/tests/migrated/test_orientation_wizard.py::TestOrientationWizard::test_generate_refine_run": 12.181063999887556, - "spyde/tests/migrated/test_orientation_wizard.py::TestOrientationWizard::test_run_without_library_errors_gracefully": 0.6670206999406219, - "spyde/tests/migrated/test_overlay_layers.py::TestColdSourceReadWarms::test_cold_derived_read_skips_then_warms_then_paints": 0.04565099999308586, - "spyde/tests/migrated/test_overlay_layers.py::TestDeadLayerSkip::test_dead_layer_not_read_or_painted": 0.7164695000974461, - "spyde/tests/migrated/test_overlay_layers.py::TestEagerRegionParity::test_eager_region_mean_is_unrounded": 0.009970800019800663, - "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_async_tier_move_skips_without_error": 0.7704569001216441, - "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_nav_move_refreshes_layer": 1.3708660000702366, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_add_layer_same_shape": 0.5767293999670073, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_query_reemits_state": 0.5727293998934329, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_self": 0.2381992000155151, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_shape_mismatch": 0.23152819997631013, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlaySet::test_set_reflected_in_layer_state": 0.5822542000096291, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_remove_layer": 0.570539299864322, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_source_close_drops_layers_on_target": 0.5656804998870939, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_target_close_drops_layers": 0.5602927999570966, - "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_tile_mode_refused": 0.5562790000112727, - "spyde/tests/migrated/test_overlay_layers.py::TestPendingFramesRace::test_write_between_read_and_clear_is_not_lost": 0.3165094000287354, - "spyde/tests/migrated/test_overlay_layers.py::TestShapeChangeDropsLayers::test_shape_changing_paint_drops_layers_cleanly": 0.5658139000879601, - "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_found_vectors_overlay_hides_on_deselect": 2.081152700004168, - "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_set_overlay_unknown_is_noop": 0.38612230005674064, - "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_changed_nav_grid_declines": 0.011123200063593686, - "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_identity_rebin_declines": 0.00832799996715039, - "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_no_parent_declines": 0.015162299969233572, - "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_non_integer_rebin_factor_declines": 0.011966499965637922, - "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_unknown_transformation_declines": 0.015092200017534196, - "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_parent_reader_is_shared_not_rebuilt": 0.03443060000427067, - "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_residency_follows_the_parent": 0.01784280000720173, - "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_dtype_matches_the_derived_signal": 0.01658949989359826, - "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_frame_matches_the_dask_view": 0.030798699939623475, - "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_reader_resolves_to_per_frame": 0.030523400055244565, - "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_matches_a_plain_per_frame_mean": 0.05320900003425777, - "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_spanning_parent_chunks": 0.06165290006902069, - "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_html_is_small": 0.2120910999365151, - "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_imports_shared_bundle": 0.21587550011463463, - "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_shared_bundle_written_once": 0.34618230001069605, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_crosshair": 0.0013581999810412526, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_rectangle_selector": 0.001380000147037208, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_effective_scale_seconds_helpers": 0.0018596999580040574, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_fallback_to_default_fps_on_garbage_scale": 0.0018170999828726053, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_cycles_speed": 0.009364199941046536, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_emits_speed_in_state": 0.004721099976450205, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_frame_skipping_tracks_wall_time": 0.6056430001044646, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_garbage_scale_still_plays_at_default": 0.1257303999736905, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_loop_wraps_to_start": 0.40499790012836456, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_matches_a_1d_line_and_range_selector": 0.001372199971228838, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_no_movie_selector_is_noop": 0.0008799999486654997, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_non_insitu_tree_is_not_played": 0.0017389999702572823, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_pause_stops_advancing": 0.40530939993914217, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_advances_frames": 0.10665589990094304, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_toggle_pauses_while_fast_forwarding": 0.003907700069248676, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_realtime_pacing_from_scale": 0.605353599996306, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_restart_does_not_desync_playing_state": 0.4136902999598533, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_single_step": 0.0013711999636143446, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_speed_multiplier_advances_faster": 0.8085177002940327, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_stops_at_last_frame_without_loop": 0.06575419998262078, - "spyde/tests/migrated/test_playback.py::TestPlayback::test_units_ms_behaves_like_seconds": 0.605586199904792, - "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_fast_forward_via_dispatch_cycles_speed": 0.25603699998464435, - "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_play_then_pause_via_dispatch": 0.42228409997187555, - "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_session_playback_property_and_dispatch": 0.4604220000328496, - "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_calibrated_x_axis_reaches_set_data": 0.005131699959747493, - "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_default_y_label_is_intensity": 0.003769699833355844, - "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_edit_units_repropagates_on_repaint": 0.003426700015552342, - "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_length_mismatch_keeps_default_x_axis": 0.008303500013425946, - "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_signal_quantity_overrides_default_y_label": 0.0038656999822705984, - "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_nav_axis_edit_reaches_navigator_display_axes": 0.2568593999603763, - "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_signal_plot_still_uses_signal_axes": 0.23323780007194728, - "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_apply_plot_title_pushes_dataset_name": 0.0037990000564604998, - "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_empty_title_leaves_strip_blank": 0.003589700092561543, - "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_ignores_blank": 0.21832380001433194, - "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_updates_root_and_emits": 0.21538920002058148, - "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_1d_scan_works": 0.0018990000244230032, - "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_corner_has_two_neighbours": 0.002182199852541089, - "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_an_interior_position_has_four": 0.00202369992621243, - "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_they_are_actual_neighbours": 0.0021762000396847725, - "spyde/tests/migrated/test_polish.py::TestPolish::test_a_clean_scan_needs_no_passes": 0.02771169994957745, - "spyde/tests/migrated/test_polish.py::TestPolish::test_a_signal_with_no_grid_is_left_alone": 0.01549589994829148, - "spyde/tests/migrated/test_polish.py::TestPolish::test_it_never_makes_a_position_worse": 0.02467940014321357, - "spyde/tests/migrated/test_polish.py::TestPolish::test_it_rescues_a_sabotaged_position": 0.1741701998980716, - "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_corner_is_not_judged_on_chisq_alone": 0.0026522999396547675, - "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_local_outlier_is_caught": 0.003468099981546402, - "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_position_that_did_not_converge_is_poor_whatever_its_chisq": 0.0027289999416098, - "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_sharp_edge_can_be_flagged": 0.002593600074760616, - "spyde/tests/migrated/test_polish.py::TestPoorMask::test_poor_is_local_not_absolute": 0.0035851000575348735, - "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_cpu_device_uses_numpy_reference": 0.02339139999821782, - "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_gpu_prep_env_gate": 0.0010841001057997346, - "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_torch_prep_path_matches_numpy_on_cpu_tensor": 0.052831499953754246, - "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_canonical_scale_factor_matches": 0.0016859000315889716, - "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_gaussian_blur_matches_scipy": 0.039038099930621684, - "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_normalize_input_matches_numpy": 0.044296200037933886, - "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_pad_to_multiple_matches_numpy": 0.002268300042487681, - "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_scale_matches_scipy_zoom": 0.012872299994342029, - "spyde/tests/migrated/test_preview_setparams.py::test_navigation_path_renders_via_engine": 0.012982600135728717, - "spyde/tests/migrated/test_preview_setparams.py::test_set_params_rerenders_peaks": 0.024117100052535534, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_different_blocks_sample_different_positions": 0.0015091000823304057, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_deterministic_per_block": 0.0008979999693110585, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_inside_the_block": 0.001814700081013143, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_single_position_block": 0.0008201999589800835, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_batch_attaches_a_preview_and_feeds_it": 1.651642500073649, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_teardown_closes_the_preview": 1.708485500072129, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_compaction_drops_the_padding": 0.0008085999870672822, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_empty_position_renders_blank_not_none": 0.0008279000176116824, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_matches_the_finalized_render": 0.0012216001050546765, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_renders_a_disk_at_the_peak": 0.0010373999830335379, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_store_is_capped": 0.0009298000950366259, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_unknown_position_renders_none": 0.000799400033429265, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestOrchestratorPlumbing::test_on_chunk_block_is_optional": 0.0018675001338124275, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_attaches_to_a_navigator_plus_signal_window": 0.06250900006853044, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_block_paints_a_sample_frame": 0.06701309990603477, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_does_not_clobber_the_final_display": 0.05455580004490912, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_restores_the_original_slice_fn": 0.05706530006136745, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_computed_position_renders_on_demand": 0.06065419991500676, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_no_navigator_window_is_a_no_op": 0.02894310001283884, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_out_of_bounds_index_is_not_ready": 0.05462690000422299, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_parked_navigator_refires_instead_of_sampling": 0.07375999994110316, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_sample_paints_are_throttled": 0.07398339989595115, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_served_and_declined_reads_are_counted": 0.052982999943196774, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_uncomputed_position_returns_none": 0.0702389997895807, - "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_user_drag_holds_off_the_sampler": 0.08514469990041107, - "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_eager_virtual_image_is_nonzero": 0.5682677999138832, - "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_lazy_virtual_image_is_nonzero": 0.5832123000873253, - "spyde/tests/migrated/test_progressive_windowed.py::TestVirtualImageMaskedSum::test_einsum_path_matches_product_reference": 0.057719900039955974, - "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_cancel_cancels_every_outstanding_chunk": 0.02438860002439469, - "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_error_propagates_via_result": 0.013939500087872148, - "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_primes_small_then_sends_the_rest_in_one_submit": 0.03846949990838766, - "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_stop_event_halts_topups": 0.5101722001563758, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_background_is_ignored": 0.001274899928830564, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_inactive_components_are_excluded": 0.0012527001090347767, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_lines_filter_selects_one_line": 0.0013127001002430916, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_negative_intensities_are_clamped": 0.001307699945755303, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_one_map_per_element": 0.0021074998658150434, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_reads_a_tabulated_edge_intensity": 0.00126369995996356, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_reshapes_to_the_scan": 0.0013327999040484428, - "spyde/tests/migrated/test_quantify.py::TestBridge::test_sums_a_family": 0.001353600062429905, - "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_quantify_result_carries_the_raw_maps": 0.0010184000711888075, - "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_recovers_the_composition_the_data_was_built_from": 0.002016099984757602, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[C_K-want3]": 0.002654799958691001, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Cu_Kb1-want2]": 0.0025007000658661127, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Fe_Ka-want0]": 0.0026741999899968505, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[O_K-want1]": 0.0025147999403998256, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[Offset]": 0.0014170000795274973, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[PowerLaw]": 0.0014173000818118453, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[]": 0.0014054999919608235, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[background_order_6]": 0.002360299928113818, - "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[not-a-line]": 0.0014954999787732959, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_cliff_lorimer_applies_k_factors": 0.0009870000649243593, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_eels_divides_by_cross_section": 0.0010187000734731555, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_fractions_sum_to_one_across_a_map": 0.0013049999251961708, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_missing_factors_default_and_are_reported": 0.0009418000699952245, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_no_maps_is_an_error": 0.0009314999915659428, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_relative_normalises_to_one": 0.0013229000614956021, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_result_says_it_is_relative": 0.000907700159586966, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_unknown_method_is_rejected": 0.0010641999542713165, - "spyde/tests/migrated/test_quantify.py::TestQuantify::test_zero_signal_is_nan_not_a_divide_error": 0.0009413000661879778, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_short_movie_cannot_seed_past_the_end": 0.7855398998362944, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_usable_span_survives_toggling_off_and_on": 0.7899340997682884, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_first_integrate_gives_the_default_width_not_the_whole_axis": 0.7884545000270009, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_it_centres_on_the_crosshair": 0.786074300063774, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_the_drawn_span_matches_the_frames_actually_read": 0.7687024000333622, - "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_uncalibrated_axis_still_gets_the_default": 0.7869066001148894, - "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_geometry_clamped_on_resize": 0.6853166999062523, - "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_indices_bounded_per_dim": 0.7057618999388069, - "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_geometry_clamped_on_resize": 0.6730478999670595, - "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_indices_bounded": 0.6832559000467882, - "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_rectangle_widget_carries_the_cap": 0.6862336999038234, - "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_span_widget_cap_tracks_the_axis_scale": 0.6903430001111701, - "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_a_contended_read_does_not_wait": 0.003180100000463426, - "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_concurrent_reads_all_return_the_right_frame": 0.13617199996951967, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_clamped_span_reads_one_frame_not_n": 0.00138669996522367, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_duplicates_do_not_disturb_a_live_running_sum": 0.002532699960283935, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_float_source_with_duplicates_is_still_exact": 0.0015665000537410378, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs0]": 0.0018702999223023653, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs1]": 0.0017078000819310546, - "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs2]": 0.001780400169081986, - "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float32]": 0.0015118999872356653, - "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float64]": 0.0015986999496817589, - "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[int32]": 0.001603799988515675, - "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[uint16]": 0.001617399975657463, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_float64_accumulator": 0.00098540005274117, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_small_frame_without_importing_torch": 0.0009854999370872974, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[0-False]": 0.0012107000220566988, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[1-True]": 0.0012551001273095608, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[no-False]": 0.001217600074596703, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[true-True]": 0.0012133000418543816, - "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_off_by_default": 0.0009914999827742577, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_a_jump_with_no_overlap_still_matches": 0.007133399951271713, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_float_source_never_goes_incremental": 0.004933999967761338, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_resize_changes_the_divisor_correctly": 0.0093417001189664, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slid_window_matches_a_cold_recompute": 0.02031999989412725, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slide_touches_only_the_entering_and_leaving_frames": 0.006051999982446432, - "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_uint16_running_sum_is_exact_at_the_cap": 0.0039022000273689628, - "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_a_different_signal_key_does_not_reuse_the_sum": 0.004121600068174303, - "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_invalidate_forces_a_recompute": 0.003987399977631867, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_2d_nav_points_match": 0.002125200000591576, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_band_split_does_not_reorder_summation": 0.0021955999545753, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[16]": 0.0029448000714182854, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[17]": 0.002934899996034801, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[1]": 0.0028335998067632318, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[256]": 0.008845599950291216, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[2]": 0.002903300104662776, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[3]": 0.0028811999363824725, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[5]": 0.002850899938493967, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float32]": 0.005123700015246868, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float64]": 0.004945899941958487, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int16]": 0.005691000027582049, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int32]": 0.0062628998421132565, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint16]": 0.006033699959516525, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint8]": 0.01586800010409206, - "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_threading_off_gives_the_same_answer": 0.005634899949654937, - "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_clear_restores_the_default": 0.0008097001118585467, - "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_grows_to_hold_a_big_frame_roi": 0.00081619992852211, - "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_is_bounded_by_the_ceiling": 0.0008091001072898507, - "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_never_drops_below_the_default": 0.0008079000981524587, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_float64_accumulator_declines_the_gpu": 0.0007542999228462577, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_cpu_backend_exactly": 0.0007519000209867954, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_serial_reference_exactly": 0.000744700082577765, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[i16-int16]": 0.0009389998158439994, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[u8-uint8]": 0.000955199939198792, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_saturated_uint16_stays_exact_at_the_cap": 0.0006940999301150441, - "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_the_gpu_path_actually_engaged": 4.4400909000542015, - "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_held_parameter_makes_them_distinguishable": 0.0008474999340251088, - "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_lone_component_is_not": 0.000699399970471859, - "spyde/tests/migrated/test_relabel.py::TestGrouping::test_different_kinds_are_not_exchangeable": 0.0008324999362230301, - "spyde/tests/migrated/test_relabel.py::TestGrouping::test_two_of_a_kind_are_exchangeable": 0.0008064998546615243, - "spyde/tests/migrated/test_relabel.py::TestItDoesNotChangeTheFit::test_the_model_curve_is_unchanged": 0.003922200063243508, - "spyde/tests/migrated/test_relabel.py::TestOnTheRealScan::test_two_gaussians_becomes_consistent": 2.56848140002694, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_scrambled_scan_becomes_consistent": 0.0029680998995900154, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_single_position_is_untouched": 0.0009449000936001539, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_an_already_consistent_scan_is_left_alone": 0.0025676999939605594, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_inseparable_components_are_not_reordered": 0.002297199913300574, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_it_permutes_and_invents_nothing": 0.0033104000613093376, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_the_separation_threshold_is_what_decides": 0.0022306001046672463, - "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_whole_components_move_together": 0.0025693997740745544, - "spyde/tests/migrated/test_report_annotation_coords.py::TestCalibratedTextAnnotation::test_text_center_converts_to_pixel_center": 0.02481820003595203, - "spyde/tests/migrated/test_report_annotation_coords.py::TestReversedAxis::test_reversed_x_axis_offsets_and_u_sign": 0.011623799917288125, - "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_arrow_uv_scale_signed": 0.011549399932846427, - "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_circle_radius_converts_by_mean_scale": 0.011919099953956902, - "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_ellipse_widths_heights_convert": 0.011434699990786612, - "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_rect_widths_heights_convert": 0.011543400003574789, - "spyde/tests/migrated/test_report_annotation_coords.py::TestSpecNotMutated::test_build_twice_same_result_and_spec_untouched": 0.02276930003426969, - "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_no_axes_is_identity": 0.018474500044248998, - "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_unusable_axes_is_identity": 0.013273200020194054, - "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_default_center_callout": 0.24410410004202276, - "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_explicit_indices_clamped": 0.2551829000003636, - "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_no_nav_axes_errors": 0.19100589992012829, - "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_rank_mismatch_errors": 0.24944040004629642, - "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_geometry_change_persists_without_rebuild": 0.22690069989766926, - "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_spec_round_trips_new_inset_keys": 0.20590159995481372, - "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_unknown_inset_id_is_silent_noop": 0.2255756000522524, - "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_clamps": 0.2982078001368791, - "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_reslices": 0.31071299978066236, - "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_no_marker_outside_edit_mode": 0.2605733999516815, - "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_unchanged_position_skips_rebuild": 0.2521514998516068, - "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_guards": 0.008028399897739291, - "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_lazy_4d_slices_only": 0.022713399957865477, - "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_time_callouts_compute_single_frames_only": 0.31536380003672093, - "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_zoom_callout_and_drag_never_compute_dataset": 0.27702589984983206, - "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_2d_image_nav_dims_0": 0.18358850001823157, - "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_4d_panels_carry_nav_dims_2": 0.23840840021148324, - "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_movie_panel_nav_dims_1": 0.25120779999997467, - "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_4d_refresh_keeps_position": 0.2814439000794664, - "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_movie_refresh_keeps_time_frames": 0.35636440000962466, - "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_2d_nav_refused": 0.24757990008220077, - "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_three_insets_start_mid_end": 0.31304569996427745, - "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_center_region_on_plain_2d_image": 0.1946987999835983, - "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_region_clamped_on_small_image": 0.023895599995739758, - "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_explicit_region_clamped_to_bounds": 0.20417599997017533, - "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_on_scene3d_panel": 0.24583140015602112, - "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_without_base_snapshot": 0.1962103999685496, - "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_no_rect_outside_edit_mode": 0.2052904999582097, - "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_clamps_to_bounds": 0.22855999995954335, - "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_recrops": 0.23137279995717108, - "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_unchanged_region_skips_rebuild": 0.21779319981578737, - "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_defaults_slide_break_false_when_omitted": 0.1876359002199024, - "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_falls_back_to_active_window": 0.19668739999178797, - "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_no_active_window_errors_cleanly": 0.17369270010385662, - "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_sets_slide_break_and_snapshot": 0.19193150009959936, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_callout_navigator_base_converts_region_to_data": 0.2743730000220239, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_crosshair_selector_gives_no_region": 0.0012608000542968512, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_calibrated": 0.0013067000545561314, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_uncalibrated_passthrough": 0.0012336999643594027, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_by_navigator_parent": 0.0013524999376386404, - "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_uses_selector_linked_to_source": 0.001505299936980009, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_adds_inset": 0.2532308999216184, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_signal_base_has_no_connector": 0.2523142999270931, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_appends_layer": 0.19419019995257258, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_forced_mismatch_refused": 0.2342998000094667, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_down_then_insert_stays_grid": 0.2815333000617102, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_left_prepends_and_shifts": 0.2445172001607716, - "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_right_grows_grid": 0.25757559994235635, - "spyde/tests/migrated/test_report_compose.py::TestEdits::test_annotation_crud": 0.24480969994328916, - "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_last_layer_removes_panel_and_collapses_cell": 0.19198530004359782, - "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_overlay_layer": 0.21951890003401786, - "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_panel_from_grid": 0.2614060001214966, - "spyde/tests/migrated/test_report_compose.py::TestEdits::test_set_layer_updates_spec": 0.22568829986266792, - "spyde/tests/migrated/test_report_compose.py::TestLayeredAddToReport::test_layered_plot_carries_layers": 0.22497129999101162, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_column_preset": 0.28658040007576346, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_grid_preset": 0.2684954998549074, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_hspace_wspace_preserved": 0.2924281000159681, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_inset_panels_untouched": 0.28885429992806166, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_row_preset": 0.28157350013498217, - "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_unknown_preset_errors_no_change": 0.2739206999540329, - "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_multi_panel_target_excludes_overlay": 0.2495113000040874, - "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_tiles_only": 0.23888479999732226, - "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_nav_signal_pair_offers_callout": 0.24033719999715686, - "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_same_shape_offers_overlay": 0.20975549996364862, - "spyde/tests/migrated/test_report_compose.py::TestRoundTrip::test_composed_spec_roundtrips": 0.27933320007286966, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_hole_fill_no_grid_growth": 0.31310059991665184, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_legacy_no_target_matches_old_semantics": 0.2712086000246927, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_occupied_neighbor_inserts_row_and_shifts": 0.31533170002512634, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_sparse_grid_survives_renormalise_and_build": 0.3263197998749092, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_down_right_panel_makes_2x2": 0.25299989990890026, - "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_left_on_interior_panel_inserts_column": 0.2981235000770539, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_closed_state_has_report_type": 0.009247199981473386, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_default_type_is_report": 0.007678000023588538, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_sets_type": 0.008304300135932863, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_unknown_type_normalizes": 0.007433900027535856, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_state_emits_type": 0.008452699985355139, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_absent_type_defaults_to_report": 0.0012917999411001801, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_presentation": 0.0029261999297887087, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_report": 0.0019543999806046486, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_movie_type_tolerated": 0.001990900025703013, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_unknown_type_normalizes_to_report": 0.0013190999161452055, - "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_zip_round_trip": 0.026847200002521276, - "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_arrow_linewidth_flows_to_live_widget": 0.22708569990936667, - "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_circle_linewidth_flows_to_live_widget": 0.2192701998865232, - "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_rect_linewidth_flows_to_live_widget": 0.22321379999630153, - "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_text_fontsize_flows_to_live_widget": 0.21436570002697408, - "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_circle_drag_updates_offset_and_radius": 0.2264978998573497, - "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_text_drag_updates_data_no_rebuild": 0.2052020999835804, - "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_edit_on_makes_widgets_off_makes_markers": 0.21833659999538213, - "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_toggle_same_value_is_noop": 0.22914629988372326, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_add_and_remove_fig_annotation_no_rebuild": 0.20294659992214292, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_update_fig_annotation_no_rebuild": 0.21818720002193004, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_interactive_sets_edit_chrome_and_markers": 0.2183534000068903, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_non_interactive_sets_markers_not_chrome": 0.22664000000804663, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_panel_map_stashed": 0.20114909997209907, - "spyde/tests/migrated/test_report_edit_mode.py::TestFigureMarkerDrag::test_marker_drag_persists_no_rebuild": 0.21682670002337545, - "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_arrow_uv_roundtrip_signed": 0.22401020012330264, - "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_rect_center_topleft_roundtrip": 0.21146380016580224, - "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_after_panel_removed_no_change": 0.21351529995445162, - "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_index_out_of_range_no_change": 0.21943860012106597, - "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_fig_annotation_rejects_bad_kind": 0.2044849001104012, - "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_update_remove_fig_annotation_round_trip": 0.20189870009198785, - "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_applies_hspace_wspace": 0.22413710004184395, - "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_clamps_to_unit_range": 0.22792809992097318, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_color_update_no_rebuild": 0.22159540001302958, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_text_update_no_rebuild": 0.21883169992361218, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_kind_change_rebuilds_even_in_edit_mode": 0.23606859997380525, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_non_edit_mode_update_rebuilds": 0.22606899996753782, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_figure_background_deselects": 0.22347909992095083, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_panel_pointer_down_selects_and_outlines": 0.24316809989977628, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_repfig_select_panel_action": 0.20996000000741333, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_select_unknown_panel_is_figure_level": 0.22454730013851076, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_selection_survives_rebuild": 0.23109070013742894, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_exchanges_grid_pos_and_rebuilds": 0.2877192000159994, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_same_panel_is_noop": 0.275848799967207, - "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_unknown_dispatch_id_is_noop": 0.26522400008980185, - "spyde/tests/migrated/test_report_edit_mode.py::TestRectArrowUncalibratedRoundTrip::test_rect_center_topleft_identity": 0.21793639997486025, - "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_arrow_tail_reshape_keeps_head_fixed": 0.21864279999863356, - "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_circle_radius_resize_persists_data_radius": 0.20579889987129718, - "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_rect_corner_resize_persists_center_and_size": 0.1996341998456046, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_dispatch_panel_id_resolves_to_spec_panel": 0.2036902999971062, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_event_style_target_aliases": 0.20953800005372614, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_fallback_persists_when_cell_not_live": 0.21876229997724295, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_size_errors_and_leaves_spec_untouched": 0.2109080000082031, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_target_errors_and_leaves_spec_untouched": 0.19855339999776334, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_live_push_no_rebuild": 0.2063908000709489, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_size_is_clamped": 0.19920649996493012, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_round_trip_and_omitted_when_unset": 0.000982399913482368, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_yaml_round_trip": 0.004776000045239925, - "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_verb_persists_on_spec_and_to_dict": 0.2040934000397101, - "spyde/tests/migrated/test_report_edit_mode.py::TestUncalibratedIdentity::test_drag_persists_pixel_values_identically": 0.2216214999789372, - "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_echoes_token_verbatim": 0.20007330004591495, - "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_omits_token_when_absent": 0.20043229998555034, - "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_echoes_token_verbatim": 0.20566680002957582, - "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_omits_token_when_absent": 0.1994070999789983, - "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_has_sandboxed_iframes_no_bin": 0.27600399998482317, - "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_offline_falls_back_to_img": 0.23374859988689423, - "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_folder_matches_zip_serialization": 0.23985210002865642, - "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_reexport_over_prior_export_ok": 0.22742759983520955, - "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_refuses_non_empty_foreign_dir": 0.20710710005369037, - "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_resolvable_rebuilds_live": 0.20699440001044422, - "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_unresolvable_is_offline_with_png": 0.00898879999294877, - "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_markdown_cell": 0.008465099963359535, - "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_html_has_title_imgs_captions": 0.21893649990670383, - "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_no_open_report_errors": 0.010921600041911006, - "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_skips_placeholder": 0.20399870013352484, - "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_temp_writes_unique_tempfile": 0.23819500009994954, - "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_one_panel_updates_only_that_panel": 0.2590346001088619, - "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_cell_id_is_noop": 0.008297500084154308, - "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_panel_id_is_noop": 0.18170179997105151, - "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unresolvable_source_keeps_old_snapshot": 0.19285920006223023, - "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_whole_figure_refresh_still_refreshes_every_panel": 0.2629238999215886, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_a_slides_only_cell_really_does_end_the_slide": 0.007101600058376789, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_cell_lazily_opens_report": 0.00790020008571446, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_markdown_cell": 0.00810480013024062, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_close_emits_closed_state": 0.008140300051309168, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_deleting_a_slide_head_keeps_the_slide": 0.008062500040978193, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_move_cell": 0.007978300214745104, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_clears_the_undo_stack": 0.008092300035059452, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_emits_open_state": 0.00793540000449866, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_template_flag": 0.007994699873961508, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_remove_cell": 0.007893200148828328, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_state_advertises_what_undo_would_do": 0.00803019991144538, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_next_slides_head_is_not_absorbed": 0.008178599993698299, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_slide_keeps_its_style_and_notes": 0.008525199955329299, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_does_not_split_the_slide_in_two": 0.008390499977394938, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_is_bounded": 0.008579700021073222, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_puts_the_cell_back_where_it_was": 0.007716199848800898, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_restores_a_deleted_cell": 0.008031399920582771, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_with_an_empty_stack_is_harmless": 0.008241400006227195, - "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_update_cell": 0.007773100049234927, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_bad_source_errors": 0.008457399904727936, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_fills_placeholder_in_place": 0.1903818000573665, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_snapshots_and_emits_report_figure": 0.1974576999200508, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_refresh_figure_reemits": 0.21033369994256645, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_caption": 0.19213169999420643, - "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_title": 0.008238900103606284, - "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_open_offline_when_source_gone_includes_png": 0.22561580000910908, - "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_save_then_open_rebinds_live": 0.2447784999385476, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_assemble_assets_empty_harvest_uses_baked_fallback": 0.19429440016392618, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_empty_harvested_png_still_writes_baked_asset": 0.2491698000812903, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_figure_with_no_pixels_is_recorded_as_dropped": 0.1996105998987332, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_finish_save_warns_on_dropped_figure": 0.198187000118196, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_remembers_path": 0.18539089988917112, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_with_no_renderer_reply_bakes_png": 0.2347169000422582, - "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_snapshots_completes_pending_save": 0.2509984999196604, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_build_figure_window_early_return_tears_down_stale": 0.19204249989707023, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_tears_down_controllers": 0.19293910008855164, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_when_never_opened": 0.008193800109438598, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_add_figure_two_cells": 0.20482189988251776, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_new_is_idempotent": 0.009267800021916628, - "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_remove_figure_cell_tears_down_its_window": 0.19267550006043166, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_accepts_bare_base64": 0.007829400012269616, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_at_index": 0.00754590006545186, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_creates_cell_and_emits_data_url": 0.016833300003781915, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_gif_ext_and_mime": 0.007653900072909892, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_jpeg_normalises_to_jpg": 0.008252699975855649, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_no_data_errors": 0.008579000015743077, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_unknown_ext_falls_back_to_png": 0.008140899939462543, - "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_size_cap_rejects_oversized_image": 0.009131000027991831, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_remove_image_cell_clears_held_bytes": 0.0074365000473335385, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_set_caption_edits_image_caption": 0.007693100138567388, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_update_cell_edits_image_caption": 0.00796519999857992, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_double_round_trip_stable": 0.0029485999839380383, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_and_figure_interleaved_distinguished": 0.0018972000107169151, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_round_trips_through_md": 0.0018930000951513648, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_serializes_with_ext_no_yaml": 0.0021128999069333076, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_nonpng_image_ref_parses_as_image_cell": 0.001250099972821772, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_png_ref_defaults_to_figure_in_parse": 0.0011082000564783812, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_end_to_end_add_save_reopen_via_handlers": 0.02630890009459108, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_figure_png_with_yaml_stays_figure": 0.02191419992595911, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_png_image_without_yaml_promoted_to_image_cell": 0.020158199942670763, - "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_save_and_reopen_restores_image_bytes": 0.027750000008381903, - "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_gif_export_uses_gif_mime": 0.030669800122268498, - "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_slides_export_inlines_image_data_url": 0.048899499932304025, - "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_static_export_inlines_image_data_url": 0.029358199913986027, - "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell": 0.008546499884687364, - "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell_missing_bytes_errors": 0.0076255000894889235, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_absent_leaves_unchanged": 0.37592190015129745, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_capped_at_120_chars": 0.36405850015580654, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_empty_string_clears": 0.377853799960576, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_layerspec_emits_styling_only_when_set": 0.0010640998370945454, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_linewidth_clamped": 0.3734197999583557, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_set_layer_persists_and_rebuilds": 0.3500941999955103, - "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_yaml_round_trip_live_cell": 0.37797789985779673, - "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_build_figure_window_creates_plot1d": 0.34857480006758124, - "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_length_mismatch_falls_back_to_index_axis": 0.36543390003498644, - "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_styling_reaches_live_state": 0.35605829989071935, - "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_text_sizes_apply_to_line_panel": 0.34481110016349703, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_axes_carries_x_axis_and_units": 0.3581094001419842, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_bad_current_data_returns_none": 0.34216570015996695, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_base_layer_styling_captured_from_live_plot1d": 0.34042309992946684, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_no_scalebar_or_colorbar_on_line_panel": 0.34492700011469424, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_map_holds_1d_array": 0.35279180004727095, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_produces_line_panel": 0.3581856999080628, - "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_tolerates_missing_plot1d_state": 0.3387667001225054, - "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_refresh_panel_resnapshots_curve": 0.3541992000536993, - "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_repfig_refresh_panel_handler_no_error": 0.366232099942863, - "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_report_refresh_figure_no_error": 0.3570011000847444, - "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_annotation_refused": 0.3543463001260534, - "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_callout_refused": 0.36545119993388653, - "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_time_callouts_refused": 0.35934810002800077, - "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_zoom_callout_refused": 0.34531719994265586, - "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_auto_clim_when_none": 0.0022850000532343984, - "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_downsamples_huge_frame": 0.5536231999285519, - "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_returns_decodable_png": 0.0035306999925523996, - "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_rgb_passthrough": 0.0016040998743847013, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_absent_key_yields_empty": 0.0007841999176889658, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_default_empty": 0.0007899000775068998, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_yaml_round_trip": 0.008055899990722537, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_zip_round_trip": 0.04314910003449768, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_primary_layer_helper": 0.0008223999757319689, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_has_no_python_object_tags": 0.0023064000997692347, - "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_round_trip": 0.005246699904091656, - "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_match_and_mismatch": 0.004828799865208566, - "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_missing_file": 0.0008234999841079116, - "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_dict_round_trip": 0.0007473001023754478, - "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_resolve_none_session": 0.0007303999736905098, - "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_bad_scalar_in_layer_records_error": 0.04663550003897399, - "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_malformed_spec_yaml_records_error_not_raises": 0.04952870006673038, - "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_spec_error_is_not_persisted": 0.004319500061683357, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_basic_markdown_and_figure": 0.0036964999744668603, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_code_fence_with_figure_lookalike_not_parsed": 0.002620199811644852, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_double_round_trip_stable": 0.002582100103609264, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_round_trips_stable": 0.002959800069220364, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_with_inner_triple_fence": 0.0021921000443398952, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_tilde_fence_with_inner_triple_tilde": 0.0022940998896956444, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_front_matter_fields": 0.0032001000363379717, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_inline_image_is_not_a_figure_cell": 0.002596299978904426, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_interleaved_cells_order_preserved": 0.0019858001032844186, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_non_spyde_html_comment_survives": 0.0025472999550402164, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_placeholder_parsing_with_and_without_caption": 0.0019186000572517514, - "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_tilde_fence_lookalike_not_parsed": 0.0025941000785678625, - "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_different_shape_rebinds_correct": 0.0008211000822484493, - "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_same_shape_is_ambiguous_offline": 0.0007607999723404646, - "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_shape_serialized_and_tolerant_of_absence": 0.0007496998878195882, - "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_title_match_no_shape_still_binds": 0.0007414000574499369, - "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_no_partial_file_on_failure": 0.008118699886836112, - "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_overwrites_existing": 0.029995599994435906, - "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_no_json_anywhere_in_container": 0.01954369992017746, - "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_write_read_round_trip": 0.029464999912306666, - "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_forward_drag": 0.18812129995785654, - "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_moves_and_keeps_snapshots": 0.19410470000002533, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_backward_drag_lands_before_target": 0.008213299792259932, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_drag_to_end_no_index": 0.007450800039805472, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_lands_before_target_not_after": 0.0086967998649925, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_onto_immediate_next_neighbor_is_noop": 0.008813399937935174, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_same_position_is_noop": 0.008765700156800449, - "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_unknown_cell_id_is_noop": 0.007890700013376772, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_empty": 0.0009873000672087073, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_input_list_not_mutated_in_place": 0.001102800015360117, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_first_slide_to_last": 0.0020344998920336366, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_middle_forward": 0.0015493001556023955, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_multicell_slide_block": 0.002035799901932478, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_noop_same_index": 0.001111100078560412, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_out_of_range_indices": 0.0011165998876094818, - "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_three_slides_move_last_to_first": 0.0021483999444171786, - "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_multicell_slides_via_verb": 0.00858020014129579, - "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_emits_state_and_marks_dirty": 0.009478099877014756, - "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_missing_indices_noop": 0.008318200125358999, - "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_out_of_range_noop": 0.008166899904608727, - "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_three_to_one": 0.007708700140938163, - "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_clear_drops_entry": 1.0827135000145063, - "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 1.063666799920611, - "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.528962800046429, - "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_swapped_result_identity_rebuilds": 1.0528596000513062, - "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_no_orientation_is_none": 0.0008209998486563563, - "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_raw_om_through_the_signal_ref": 0.0026037999195978045, - "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_vector_om_too": 0.0023925999412313104, - "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_specless_cell_is_none": 0.0009631998836994171, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_all_four_views_plus_the_map_are_built": 0.5572151000378653, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_density_images_are_png_urls_not_raw_bytes": 0.4724201001226902, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.0025725000305101275, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_panels_are_in_axis_order": 0.5689329000888392, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_selfcontained_page": 0.5319620999507606, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_default_and_viewer_embed": 1.2385237000416964, - "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_image_mode_skips_the_viewer": 0.002306099981069565, - "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cap_refuses_embed": 0.0025942999636754394, - "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cloud_is_strided_not_truncated": 0.4719670000486076, - "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_payload_roundtrip": 0.6229308999609202, - "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_rows_are_nav_positions": 0.5163453001296148, - "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_image_mode_keeps_the_snapshot": 0.7235754999564961, - "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_orientation_cell_emits_live_explorer": 0.7214887000154704, - "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_vectors_win_when_a_tree_carries_both": 0.7429983000038192, - "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_older_file_defaults_to_viewer": 0.0007200001273304224, - "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_yaml_roundtrip": 0.0007398000452667475, - "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_tint_reaches_layer_state": 0.017936499905772507, - "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_untinted_layer_renders_as_before": 0.01789960020687431, - "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_next_unused_skips_taken_color": 0.23322660010308027, - "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_overlays_get_distinct_cycle_tints": 0.21027759998105466, - "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_html_structure": 0.20104120019823313, - "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_none_without_tint": 0.21149839996360242, - "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_interactive_export_swaps_in_blender": 0.2597763001685962, - "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_report_state_pixel_free_with_tint": 0.20858940004836768, - "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_untinted_cell_keeps_live_iframe": 0.27245169994421303, - "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_malformed_tint_ignored": 0.21132829994894564, - "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_set_and_clear_persist": 0.22697199997492135, - "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_tint_survives_alpha_edit": 0.2343085000757128, - "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_old_dict_without_tint_loads_none": 0.0008054000791162252, - "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_emits_and_from_dict_reads": 0.0008789000567048788, - "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_omits_absent_tint": 0.0009228000417351723, - "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_round_trip_carries_tint": 0.009216099977493286, - "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_without_tint_key_loads_none": 0.005408499971963465, - "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_add_cell_accepts_present_fields_inline": 0.007832799921743572, - "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_set_live_action_and_clear": 0.008293199934996665, - "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_explicit_value": 0.008716500014998019, - "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_toggles_and_emits": 0.008516100002452731, - "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_unknown_cell_is_noop": 0.007833999930880964, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_live_action_is_none": 0.0024868998443707824, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_slide_break_is_false_on_old_file": 0.001357399858534336, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_both_markers_on_one_cell": 0.002852899953722954, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_double_round_trip_stable_with_markers": 0.003577299998141825, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_live_action_round_trips": 0.003015300026163459, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_round_trips": 0.0029486999846994877, - "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_survives_zip": 0.03981270000804216, - "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_empty_slide_dropped": 0.054124899790622294, - "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_multiple_cells_per_slide": 0.04807209980208427, - "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_no_open_report_errors": 0.008999799960292876, - "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_shell_and_one_slide_per_group": 0.06299210002180189, - "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_with_figure": 0.2822274999925867, - "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_empty_doc_no_slides": 0.0008244001073762774, - "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_every_cell_lands_in_exactly_one_slide": 0.0009219000348821282, - "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_groups_by_slide_break": 0.0009188000112771988, - "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_leading_break_on_first_cell_is_noop": 0.0008661000756546855, - "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_no_breaks_single_slide": 0.0008642000611871481, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_assemble_assets_without_harvest_skips_gracefully": 0.22147419990506023, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_harvested_png_is_used_and_reused": 0.2269891999894753, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_primary_snapshot_never_returns_point_cloud": 0.22415660007391125, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_add_annotation_is_refused": 0.21975529997143894, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_compose_tile_is_refused_without_mutation": 0.21216029999777675, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_query_compose_offers_nothing": 0.22008560004178435, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_creates_scene3d_cell_with_scene_and_snapshots": 0.21822220005560666, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_without_orientation_result_errors": 0.1735979999648407, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_direction_follows_tree": 0.21660329995211214, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_report_state_stays_pixel_free": 0.21793209994211793, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_panel_refresh_recomputes_point_cloud": 0.2637135999975726, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_whole_figure_refresh_keeps_cell_live": 0.24567309999838471, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_reopen_without_result_goes_offline_gracefully": 0.2601747999433428, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_save_reopen_rebinds_live": 0.31053399993106723, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_dict_roundtrip": 0.0011716998415067792, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_scene_key_omitted_when_unset": 0.0010545998811721802, - "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_yaml_roundtrip": 0.009374000132083893, - "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_decode_tolerates_garbage": 0.0009354001376777887, - "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_empty_and_whitespace_encode_to_empty": 0.000927999964915216, - "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_roundtrip_multiline_markdown_unicode": 0.0010084999958053231, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_no_notes_no_attr": 0.041316699935123324, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_escaped_in_attr": 0.041336999856866896, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_not_rendered_as_visible_content": 0.06015589996241033, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_stashed_in_hidden_data_attr": 0.04436260007787496, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_absent_notes_default_on_old_file": 0.0012438000412657857, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_double_round_trip_stable": 0.0025906000519171357, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_coexist_with_all_markers": 0.00197199999820441, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_on_slide_first_cell_only": 0.0019809999503195286, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_round_trip_report_md": 0.00288909999653697, - "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_survive_zip": 0.03290579991880804, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_add_cell_accepts_notes_inline": 0.008475700044073164, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_clear_notes": 0.00766559992916882, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_notes_applies_to_slide_first_cell": 0.008578900014981627, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_set_notes_emits": 0.0082406000001356, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_state_emits_notes_field": 0.008413900155574083, - "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_unknown_cell_is_noop": 0.007808700087480247, - "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_meta_exposes_notes": 0.001002300065010786, - "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_empty": 0.0008990998612716794, - "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_off_first_cell": 0.0009156999876722693, - "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_via_grouping": 0.0009516000282019377, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_absent_markers_default_on_old_file": 0.002832300029695034, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_double_round_trip_stable": 0.003181600011885166, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_kind_and_style_and_break_on_one_cell": 0.005494800047017634, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_kind_round_trips": 0.0044992000330239534, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_style_round_trips": 0.004108900087885559, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_survives_zip": 0.030194399878382683, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_unknown_values_normalize_to_default": 0.00391289999242872, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_add_cell_accepts_kind_style_inline": 0.007518299971707165, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_applies_to_slide_first_cell": 0.008098999853245914, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_explicit": 0.008567300043068826, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_style": 0.007452500052750111, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_toggle_slide_kind": 0.008414699928835034, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_unknown_cell_is_noop": 0.009035799885168672, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_defaults_for_plain_content_slide": 0.0008666000794619322, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_empty_slide": 0.0008439001394435763, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_reads_kind_style_off_first_cell": 0.0008876000065356493, - "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_slides_meta_combines_with_grouping": 0.0009249999420717359, - "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_caption_renders_in_slides": 0.272710399935022, - "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_default_slide_markup_unchanged": 0.04888739995658398, - "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_slide_style_preset_class": 0.04902719985693693, - "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_title_slide_marked_and_big_title_css": 0.05972959997598082, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_add_figure_placeholder": 0.007690400001592934, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_figure_placeholder_roundtrips": 0.03134230000432581, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_photo_split_is_not_figure_like": 0.001879099989309907, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_fills_figure_side": 0.22973509994335473, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_non_split_is_noop": 0.21119830023963004, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_split_figure_side_is_refreshable": 0.24222639994695783, - "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_update_cell_edits_split_text": 0.007551600108854473, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_slides_export_renders_split_block": 0.007573499926365912, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_split_layout_orders_columns": 0.007881099940277636, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_stacked_layout_export": 0.00788199994713068, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_static_export_renders_split_block": 0.008444000035524368, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell": 0.007868299842812121, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell_default_layout": 0.008507100050337613, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout": 0.0082373998593539, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_stacked": 0.007426499971188605, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_unknown_normalizes": 0.007380400085821748, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitManagerZip::test_save_reopen_photo_split": 0.026284199906513095, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_cleans_up_figure_window": 0.23360009980387986, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_non_split_is_noop": 0.008446200052276254, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_on_empty_split_still_converts": 0.015659699914976954, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_roundtrips_through_zip": 0.27671970007941127, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_side_converts_to_markdown": 0.25920700014103204, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_then_edit_text_like_a_markdown_cell": 0.23762229993008077, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_photo_side_converts_to_markdown": 0.008821700001135468, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_figure_side_round_trips": 0.0020001999801024795, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_split_does_not_swallow_following_cell": 0.0032012000447139144, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_figure_side_round_trips": 0.002046800102107227, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_image_side_round_trips": 0.003144599962979555, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_plain_cells_not_mis_parsed_as_split": 0.001183499931357801, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_amid_plain_cells": 0.0020533999195322394, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_layout_normalizes": 0.0013401000760495663, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_text_with_image_ref_lookalike_stays_intact": 0.001973400008864701, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_non_split_cells_are_full_rows": 0.0008219998562708497, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_split_cell_is_own_cols_row": 0.0007989999139681458, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_figure_side_zip": 0.02145660005044192, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_photo_side_zip": 0.01602309988811612, - "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_png_photo_side_zip": 0.015836499980650842, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_absent_gives_defaults": 0.0008723000064492226, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_clamps_logo_height": 0.0008404998807236552, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_coerces_bools_and_ints": 0.0008333000587299466, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_drops_unknown_keys": 0.000839599990285933, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_fills_missing_keys": 0.0008475999347865582, - "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_long_text_is_capped_but_logo_is_not": 0.0008643000619485974, - "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_custom_theme_round_trips": 0.003354799933731556, - "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_pre_theme_document_loads_with_the_builtin_look": 0.0012343000853434205, - "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_untouched_deck_writes_no_theme_front_matter": 0.0013499000342562795, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_handlers_error_cleanly_with_no_open_report": 0.008032299927435815, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_reset_returns_the_builtin_look_not_the_saved_default": 0.029736600117757916, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_default_seeds_the_next_new_deck": 0.008719900040887296, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_marks_dirty": 0.007773400051519275, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_merges_rather_than_replaces": 0.008258800022304058, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_state_always_carries_a_full_theme": 0.0083263999549672, - "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_use_default_applies_the_saved_default": 0.0073908999329432845, - "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_clear_drops_entry": 0.017620200058445334, - "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_esm_text_cached_module_level": 0.001627999939955771, - "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 0.017966700019314885, - "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.011702500167302787, - "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_swapped_vectors_identity_rebuilds": 0.022590599954128265, - "spyde/tests/migrated/test_report_vectors_embed.py::TestCellResolution::test_vectors_for_cell_via_signal_ref": 0.004047500086016953, - "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[image]": 0.1990143998991698, - "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[viewer]": 0.20157880010083318, - "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_without_mode_asks_and_defers": 0.1626350999576971, - "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_plain_drop_is_unprompted": 0.2068534999853, - "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_spec_yaml_roundtrip": 0.0044343998888507485, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.002601900021545589, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_selfcontained_page": 0.015396400005556643, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_4d_page_has_neither": 0.021795300068333745, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_single_slice_stack_gets_no_stack_panel": 0.007676000008359551, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_gets_three_panels": 0.00897819991223514, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_page_carries_a_phone_layout_too": 0.015894899959675968, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_page_wires_the_stack_panel": 0.018398899934254587, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_phone_layout_drops_the_stack_panel": 0.006690500071272254, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_slider_is_the_fallback_when_the_panel_cannot_build": 0.010250799939967692, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_stack_curve_is_vectors_per_slice": 0.003212000126950443, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_default_and_viewer_embed": 0.03998220001813024, - "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_image_mode_skips_viewer": 0.004161999910138547, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_4d_scan_is_unchanged": 0.0022501000203192234, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_stack_without_an_index_is_refused": 0.0015936001436784863, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_whole_slice_is_one_contiguous_range": 0.001623000018298626, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_index_covers_every_stack_position": 0.008674700045958161, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_cap_refuses_embed": 0.002318799961358309, - "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_payload_roundtrip": 0.0035481000086292624, - "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_default_mode_embeds_explorer": 0.19088609993923455, - "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_image_cell_keeps_snapshot": 0.20600780006498098, - "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_rebuild_reuses_memoized_page": 0.19387409987393767, - "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_viewer_cell_emits_live_explorer": 0.1979562999913469, - "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_allows_a_present_package": 0.001036300091072917, - "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_hides_a_missing_package": 0.001904499949887395, - "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_gate_is_wired_into_both_filters": 0.001742199994623661, - "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_every_declared_extra_exists_in_pyproject": 0.002115700044669211, - "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[atomap-atoms]": 0.0012974999845027924, - "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[exspy-eels]": 0.0017916999058797956, - "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[kikuchipy-ebsd]": 0.0013861000770702958, - "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_unknown_package_falls_back_to_a_plain_pip_line": 0.0010138999205082655, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_a_missing_package": 0.0027799002127721906, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_an_installed_package": 0.0014194999821484089, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_does_not_import_the_package": 0.0026555999647825956, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_result_is_cached": 0.001374599989503622, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_unresolvable_package_is_absent_not_an_error": 0.001447599963285029, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_list_requires_all_of_them": 0.002422400051727891, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_no_declaration_is_always_allowed": 0.0013651000335812569, - "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_single_name_as_a_string": 0.002511599799618125, - "spyde/tests/migrated/test_requires_package_gate.py::TestRealToolbarUnaffected::test_no_current_action_is_accidentally_gated": 0.0011844000546261668, - "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_2d_rectangle_axes_are_checked_independently": 0.0015703000826761127, - "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_clamp_rewriting_geometry_fires": 0.0018625999800860882, - "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_collapse_onto_one_position_fires": 0.0015431998763233423, - "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_moved_and_resized_in_one_event_fires": 0.001580399926751852, - "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_the_warning_carries_the_preceding_events": 0.001626300043426454, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_fast_flick_is_silent": 0.0014591999351978302, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_single_point_region_is_silent": 0.0014486000873148441, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_one_edge_is_silent": 0.0015677000628784299, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_the_lower_edge_is_silent": 0.001540499972179532, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_first_event_has_nothing_to_compare_against": 0.0015228998381644487, - "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_pure_translation_is_silent": 0.0017309999093413353, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_mismatched_axis_count_is_ignored_not_fatal": 0.0014579999260604382, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[None]": 0.0010306000476703048, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad2]": 0.0010204000864177942, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad3]": 0.001038899878039956, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[nonsense]": 0.0010905000381171703, - "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_trace_all_env_logs_every_event": 0.0018832999048754573, - "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_programmatic_over_cap_set_does_fire": 0.8824681000551209, - "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_span_at_the_cap_does_not_rewrite_every_event": 0.907709899940528, - "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_sliding_an_established_span_is_quiet": 0.9136155999731272, - "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_physical_units_reach_panel_state": 0.8364225999685004, - "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_pixel_units_give_no_scale": 0.642379799974151, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestComposite5DClose::test_closing_dp_removes_composite_and_cancels_inner_settles": 0.7089374999050051, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closed_selector_dropped_from_session_lookup_tables": 0.2306592999957502, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_emits_selector_removed": 0.23828619997948408, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_removes_selector_from_multiplot_manager": 0.23533329996280372, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_navigator_and_other_signal_window_survive": 0.2307359001133591, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_queued_update_for_closed_selector_does_not_raise": 0.23417400009930134, - "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_second_selector_survives_closing_first_signal_window": 0.5590117002138868, - "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_a_write_through_the_composite_reaches_the_active_selector": 0.683240000042133, - "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_1d_composite_shares_with_both_sub_selectors": 0.671289800084196, - "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_three_views_are_one_dict": 0.6834782999940217, - "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_only_crosshair_visible_initially": 0.6883971000788733, - "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_selector_info_emitted": 0.6773178000003099, - "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_emits_updated_info": 0.6850641999626532, - "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_to_integrate_swaps_visibility": 0.6866019999142736, - "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_azimuth_preserved_low_kv": 0.0027115000411868095, - "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_center_offset_applied": 0.002155900001525879, - "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_tem_is_near_noop_in_shape": 0.0031986000249162316, - "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_none_when_no_pairs": 0.0014352001016959548, - "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_recovers_offset_center_no_direct_beam": 0.0021630999399349093, - "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_robust_to_unpaired_spots": 0.0019767999183386564, - "spyde/tests/migrated/test_sem_geometry.py::TestPrepareSemVectors::test_end_to_end_recovers_g": 0.0015826999442651868, - "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_exact_roundtrip": 0.002258000080473721, - "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_linear_overestimates_at_high_angle": 0.0019357000710442662, - "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_small_angle_linear_limit": 0.0023882000241428614, - "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[10.0-0.12204]": 0.0026618000119924545, - "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[200.0-0.02508]": 0.0025603000540286303, - "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[30.0-0.06979]": 0.0025883998023346066, - "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[5.0-0.17328]": 0.00262529996689409, - "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_roundtrip_after_write": 0.0010908000404015183, - "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_unwritten_buffer_raises_clean_valueerror": 0.0011792998993769288, - "spyde/tests/migrated/test_shm_read_robust.py::test_future_from_signal_no_ambiguous_truth": 0.0010477000614628196, - "spyde/tests/migrated/test_shm_read_robust.py::test_worker_does_not_skip_cancelled_future_but_result_is_harmless": 0.0010401998879387975, - "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_load_emits_signal_type_info": 0.43345529993530363, - "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_empty_type_reverts_to_generic": 0.7872760000173002, - "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_signal_type_recasts_and_reemits": 0.7835936000337824, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_movie_navigator_is_1d": 0.24764029996003956, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_shift_click_two_1d_navigators_builds_stacked_figure": 0.3149196000304073, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_single_chip_does_not_build_stacked": 0.2548694999422878, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_stacked_cursor_starts_at_current_selector_index": 0.45036220003385097, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_mirrors_to_the_other_row": 0.4767062000464648, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_row2_line_moves_real_selector_index": 0.41024220013059676, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_index_hook_is_installed_on_the_real_selector": 0.3214156999019906, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_programmatic_step_syncs_every_row_line": 0.4246521001914516, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_closing_the_window_detaches_the_hook": 0.27171469992026687, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_rebuild_replaces_the_prior_cursor": 0.2804755000397563, - "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_switching_back_to_single_navigator_tears_down": 0.28794599999673665, - "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_cif_reference_gives_absolute_strain": 0.2249692998593673, - "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_families_exclude_forbidden": 0.08622350008226931, - "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_snap_corrects_magnitude_to_ideal": 0.09256400016602129, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_commit_makes_new_signal_tree": 0.09801070007961243, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_component_toggle_resolves_controller_via_dispatch_window_id": 0.02678160008508712, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_controller_cif_reference_then_region": 0.18847629998344928, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_excludes_zero_beam": 0.018360600108280778, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_selector_uses_distinct_color_and_suppresses_toolbar": 0.004491200088523328, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_window_gets_distinguishing_title": 0.000969399930909276, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strain_run_emits_window_and_attaches_controller": 0.078223199932836, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strict_mode_double_mount_builds_only_one_controller": 0.13080339995212853, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_build_strain_figure_map_and_ref": 0.028790699900127947, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_each_component_builds": 0.05578669998794794, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_linear_gradient_field": 0.018563899910077453, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_principal_strain_axes": 0.00090560014359653, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_recovers_known_gradient": 0.013817900093272328, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_vectorized_matches_loop": 0.0562641000142321, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_asymmetric_detection_still_fits": 0.0020289000822231174, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_center_offset_does_not_leak_into_strain": 0.002979799988679588, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_friedel_matches_minus_g": 0.006380300037562847, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_pure_rotation_is_not_strain": 0.003527700202539563, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_recovers_known_strain": 0.00247600011061877, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_too_few_matches_returns_none": 0.0009544001659378409, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_handler_listens_on_double_click": 0.0010732001392170787, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_hit_test_is_scale_independent": 0.0012276999186724424, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_toggles_selection_and_fires_callback": 0.0013900999911129475, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_off_reference_draws_displacement_arrows": 0.0013563999673351645, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_reference_pixel_starts_with_nothing_selected": 0.0011576000833883882, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carries_forward_when_reference_moves": 0.0017319000326097012, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carry_forward_drops_peak_outside_match_radius": 0.0013614000054076314, - "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_strain_run_without_vectors_errors": 0.0008778000483289361, - "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_recompute_applies_via_dispatch_thread": 0.036719099967740476, - "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_superseded_recompute_is_dropped": 0.5540509999264032, - "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_done_callback_delivers_async": 0.011226400034502149, - "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_future_is_cancellable": 0.007832400035113096, - "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_reads_a_lazy_crop_through_same_path": 0.04121359996497631, - "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_returns_materialised_frame": 0.010791199980303645, - "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_synchronous_scheduler_no_nested_pool": 0.019214899861253798, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_band_count_matches_cubic_families": 0.007135199964977801, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_different_orientation_gives_a_different_pattern": 0.14550650003366172, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_orientation_field_has_two_distinct_grains": 0.13657550001516938, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_patterns_are_not_mirror_symmetric": 0.013935300055891275, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_same_orientation_gives_the_same_pattern": 0.15442799997981638, - "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_shape_and_dtype": 0.014142800006084144, - "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_families_overlap_as_intended": 0.0009340000106021762, - "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ground_truth_lines_readable": 0.007622600067406893, - "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ka_kb_ratio_recoverable_for_an_isolated_family": 0.015731100109405816, - "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_lines_peak_at_their_real_energies": 0.008097000070847571, - "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_shape_and_calibration": 0.009531600051559508, - "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_concentration_maps_are_asymmetric_and_distinct": 0.010077700018882751, - "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edge_intensity_tracks_its_concentration_map": 0.009743800037540495, - "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edges_step_up_at_their_onsets": 0.009774800040759146, - "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_ground_truth_is_plain_python": 0.007446000003255904, - "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_shape_and_calibration": 0.008245099917985499, - "spyde/tests/migrated/test_synthetic_data.py::TestNoOptionalExtrasRequired::test_generators_work_without_exspy_or_kikuchipy": 0.022232400020584464, - "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_ebsd]": 0.07074369990732521, - "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eds]": 0.05846970004495233, - "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eels]": 0.0784908999921754, - "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_fft_opens_output_window": 0.7584571000188589, - "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_line_profile_opens_output_window": 0.7571546999970451, - "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_unknown_action_reports_error": 0.737085800152272, - "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_virtual_imaging_opens_output_window": 0.7617915000300854, - "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_imports_and_shapes": 0.010709799942560494, - "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_commit_creates_tree": 0.034076299984008074, - "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_gen_guard_and_idempotent_remove": 0.0010832998668774962, - "spyde/tests/migrated/test_test_hold.py::TestActionWiring::test_the_release_action_is_registered_and_importable": 0.0030947000486776233, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_EVERY_caller_parks_not_just_the_first": 0.4169429000467062, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_a_forgotten_release_cannot_hang_the_run": 0.3132486999966204, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_after_release_later_chunks_do_not_stutter": 0.008334699901752174, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_below_the_threshold_does_not_park": 0.0035659001441672444, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_parks_at_the_threshold_and_resumes_on_release": 0.41238049999810755, - "spyde/tests/migrated/test_test_hold.py::TestHolding::test_release_before_the_hold_is_reached": 0.005012100096791983, - "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_an_unnamed_point_is_not_held": 0.0037303001154214144, - "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_hold_point_returns_immediately": 0.003607100108638406, - "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_release_of_an_unconfigured_hold_is_false_not_an_error": 0.0034995999885722995, - "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_unset_means_not_armed": 0.004118999931961298, - "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_a_bare_name_holds_at_once": 0.0036643999628722668, - "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_absolute_count": 0.0035752998664975166, - "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_fraction_of_total": 0.003569600055925548, - "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_rubbish_is_ignored_not_raised": 0.0037910001119598746, - "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_several_points": 0.0034964000806212425, - "spyde/tests/migrated/test_throttle.py::TestThrottle::test_burst_coalesces_while_dispatcher_is_busy": 0.11640429985709488, - "spyde/tests/migrated/test_throttle.py::TestThrottle::test_dispatcher_is_a_single_shared_lane": 0.0028172999154776335, - "spyde/tests/migrated/test_throttle.py::TestThrottle::test_min_throttle_interval_enforced": 0.001164599903859198, - "spyde/tests/migrated/test_throttle.py::TestThrottle::test_settle_timer_armed_on_move_and_clears": 0.16279060009401292, - "spyde/tests/migrated/test_throttle.py::TestThrottle::test_update_data_uses_dispatcher_not_debounce_timer": 0.0027327999705448747, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Arctan]": 0.014218399999663234, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Erf]": 0.01753489999100566, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Exponential]": 0.006590499775484204, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[GaussianHF]": 0.01564379991032183, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Gaussian]": 0.022282599937170744, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[HeavisideStep]": 0.005144800059497356, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Logistic]": 0.022468200069852173, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Lorentzian]": 0.02173080004286021, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Offset]": 0.001396800042130053, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[PowerLaw]": 0.006338300067000091, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Arctan]": 0.06674030004069209, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Erf]": 0.022238500183448195, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Exponential]": 0.009695999906398356, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[GaussianHF]": 0.023934299941174686, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Gaussian]": 0.031250399886630476, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[HeavisideStep]": 0.012635500053875148, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Logistic]": 0.026640100055374205, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Lorentzian]": 0.023036999977193773, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Offset]": 0.0033036000095307827, - "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[PowerLaw]": 0.01016100007109344, - "spyde/tests/migrated/test_torch_components.py::TestBatching::test_batched_equals_looping_one_at_a_time": 0.007447600015439093, - "spyde/tests/migrated/test_torch_components.py::TestBatching::test_offset_broadcasts_over_the_signal_axis": 0.0009603998623788357, - "spyde/tests/migrated/test_torch_components.py::TestBatching::test_one_call_evaluates_every_position_independently": 0.0011297998717054725, - "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_inactive_component_contributes_nothing": 0.0009982000337913632, - "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_sums_active_components_and_matches_hyperspy": 0.03737020003609359, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Arctan]": 0.013883800012990832, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Erf]": 0.018252999987453222, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Exponential]": 0.008633099845610559, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[GaussianHF]": 0.020335700013674796, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Gaussian]": 0.04886869993060827, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[HeavisideStep]": 0.006905199959874153, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Logistic]": 0.03199389996007085, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Lorentzian]": 0.024742199922911823, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Offset]": 0.001781499944627285, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Polynomial]": 0.008750900044105947, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[PowerLaw]": 0.00696070003323257, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Arctan]": 0.014767200103960931, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Erf]": 0.017737000016495585, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Exponential]": 0.007026499952189624, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[GaussianHF]": 0.017419600044377148, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Gaussian]": 0.024011899949982762, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[HeavisideStep]": 0.0055986999068409204, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Logistic]": 0.026955300010740757, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Lorentzian]": 0.020417800056748092, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Offset]": 0.0013289999915286899, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Polynomial]": 0.0074495000299066305, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[PowerLaw]": 0.005131800076924264, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Arctan]": 0.013965599937364459, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Erf]": 0.031131799914874136, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Exponential]": 0.013446600059978664, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[GaussianHF]": 0.026499500148929656, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Gaussian]": 0.04320189997088164, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[HeavisideStep]": 0.00630409992299974, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Logistic]": 0.029996799887157977, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Lorentzian]": 0.02686149999499321, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Offset]": 0.001334299915470183, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Polynomial]": 0.007314300048165023, - "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[PowerLaw]": 0.005984200048260391, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Arctan]": 0.01770379999652505, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Erf]": 0.02158720011357218, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Exponential]": 0.009234199998900294, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[GaussianHF]": 0.022309099906124175, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Gaussian]": 0.03616749995853752, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[HeavisideStep]": 0.006898800027556717, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Logistic]": 0.030661000055260956, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Lorentzian]": 0.028059900039806962, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Offset]": 0.0019681999692693353, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[PowerLaw]": 0.010082699940539896, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Arctan]": 0.015388199943117797, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Erf]": 0.02109940000809729, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Exponential]": 0.008535000146366656, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[GaussianHF]": 0.021679500001482666, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Gaussian]": 0.030759000102989376, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[HeavisideStep]": 0.006529800011776388, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Logistic]": 0.033136900048702955, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Lorentzian]": 0.025230000028386712, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Offset]": 0.0014673999976366758, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[PowerLaw]": 0.006032399949617684, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Arctan]": 0.03465720021631569, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Erf]": 0.03214599995408207, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Exponential]": 0.011590599897317588, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[GaussianHF]": 0.022037900052964687, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Gaussian]": 0.03239980002399534, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[HeavisideStep]": 0.03412690002005547, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Logistic]": 0.14575050002895296, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Lorentzian]": 0.03312529996037483, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Offset]": 0.0014417999191209674, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[PowerLaw]": 0.006122200051322579, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Arctan]": 0.03166780003812164, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Erf]": 0.039630900137126446, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Exponential]": 0.016523400088772178, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[GaussianHF]": 0.04279810015577823, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Gaussian]": 0.062375100096687675, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[HeavisideStep]": 0.012359800050035119, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Logistic]": 0.06360490003135055, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Lorentzian]": 0.04880359978415072, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Offset]": 0.002167199971154332, - "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[PowerLaw]": 0.012153599876910448, - "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[1]": 0.006608500028960407, - "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[2]": 0.007530400063842535, - "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[3]": 0.015300500090233982, - "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_needs_an_explicit_order": 0.0009590999688953161, - "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_no_nan_gradient_from_the_dead_branch": 0.005854700109921396, - "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_zero_below_the_cutoff": 0.00620370008982718, - "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_inactive_unsupported_component_does_not_block": 0.0019513001898303628, - "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_false_rather_than_dropping_a_component": 0.0018578001763671637, - "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_true_for_a_portable_model": 0.0018482999876141548, - "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_unknown_component_names_what_is_available": 0.0019207998411729932, - "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_columns_follow_the_packed_order": 0.0028899998869746923, - "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_evaluate_with_grad_matches_autodiff": 0.007271999958902597, - "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_reports_analytic_availability": 0.0007911999709904194, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_close_all_tears_down_tutorial_trees": 3.1178635999094695, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_navigation_by_name": 1.8908822999801487, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_unknown_name_emits_error": 0.01044870016630739, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_works_under_simulated_packaged_env": 0.7998589999042451, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_repeat_load_is_idempotent": 3.1486349999904633, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_session_begin_is_not_test_gated": 0.0018123999470844865, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_tutorial_load_not_in_test_actions_gate": 0.0017236999701708555, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_all_loaders_present_in_map": 0.007697900058701634, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_find_vectors_shape": 0.6305983999045566, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_movie_shape_is_small_and_insitu": 0.6047433000057936, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_multiphase_shape": 0.6457667999202386, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_navigation_shape": 3.3733910999726504, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_orientation_shape": 0.6347328000701964, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_spectroscopy_shape": 0.7951079000486061, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_strain_shape_is_bounded": 1.4754274999722838, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_close_all_ends_the_session": 1.0767559999367222, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_derived_result_windows_are_closed_too": 2.9350497000850737, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_only_active_session_records": 1.0721004001097754, - "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_user_file_backed_tree_is_never_closed": 2.988731100107543, - "spyde/tests/migrated/test_units.py::test_no_dollar_or_braces_remain": 0.0012722000246867537, - "spyde/tests/migrated/test_units.py::test_pyxem_latex_angstrom_macro_becomes_unicode": 0.0012977001024410129, - "spyde/tests/migrated/test_units.py::test_reciprocal_angstrom_latex_becomes_unicode": 0.002137600095011294, - "spyde/tests/migrated/test_units.py::test_reciprocal_nm_and_plain_units": 0.0012828001054003835, - "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_emits_gpu_status_result": 0.008773100096732378, - "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_reports_no_gpu_without_torch": 0.008833300089463592, - "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_staged_handler_registered": 0.0016145000699907541, - "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_defaults_to_stable": 0.008856200147420168, - "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_dispatch_action_routes_to_settings": 0.013643300044350326, - "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_restores_persisted_channel_on_restart": 0.03740909998305142, - "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_persists": 0.038402800098992884, - "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_rejects_invalid": 0.013333500013686717, - "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_disk_centered_on_vector": 0.0012996000004932284, - "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_changes_with_nav_position": 0.0012932000681757927, - "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_disk_value_is_intensity": 0.09041540010366589, - "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_1x1_region_equals_render_frame": 0.0021823999704793096, - "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_bounds_clamped_and_ordered": 0.0032012000447139144, - "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_full_region_sums_all_frames": 0.0051414999179542065, - "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_no_full_dataset_compute": 0.0016796999843791127, - "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_two_position_region_equals_sum_of_frames": 0.0017432000022381544, - "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_intensity_weighted_matches_manual_sum": 0.00161210005171597, - "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_roi_radius_excludes_far_vectors": 0.0009920999873429537, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_matches_serial": 2.125437800073996, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_progress_and_stop": 1.708540500025265, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_smoothed_strain_reduces_noise_keeps_edges": 0.059435099945403636, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_strain_component_maps": 0.0008638000581413507, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_to_orientation_map_and_ipf": 0.021846800111234188, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_tv_beats_raw_at_high_noise": 0.008543699979782104, - "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_uniform_field_recovered": 0.6784240000415593, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_intensity_scale_invariant": 0.13255829992704093, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_clean_strain": 0.05292320006992668, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_strain_across_weightings": 0.2172118000453338, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_at_raw_count_scale": 0.06547709985170513, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_to_missing_and_spurious": 0.0704753000754863, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_strain_respects_cap": 0.3171733000781387, - "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_too_few_vectors_returns_none": 0.001190899987705052, - "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_skewed_vectors_high_asymmetry": 0.0017145000165328383, - "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_symmetric_strain_low_asymmetry": 0.0017164999153465033, - "spyde/tests/migrated/test_vector_orientation.py::TestIntegrationAg::test_recovers_orientation_and_strain": 15.120775800081901, - "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_identity": 0.001092500169761479, - "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_rotation": 0.0010605999268591404, - "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_translation": 0.0010395999997854233, - "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_clamps_excess_strain": 0.0010649999603629112, - "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_forbids_reflection": 0.0010142000392079353, - "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_within_bound_unchanged": 0.0011842000531032681, - "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_progress_and_shm_preview": 13.051769300014712, - "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_recovers_known_strain": 13.456247700145468, - "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_stop_flag_aborts": 9.823722200118937, - "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_fit_field_prefers_gpu_then_falls_back": 0.0028598998906090856, - "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_generate_activates_live_refine_overlay": 11.826642000232823, - "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_generate_then_run": 12.837129999883473, - "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_run_without_library_errors_gracefully": 2.7552490999223664, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_pure_rotation_in_theta": 0.001731499913148582, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_parked_in_A_is_recovered": 0.0012158999452367425, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_split_between_theta_and_A_adds_up": 0.0009112998377531767, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_strain_is_unchanged_by_the_split": 0.0012450999347493052, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_symmetric_stretch_does_not_tilt_the_angle": 0.0009161998750641942, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_full_template_beats_a_sparse_exactly_matching_decoy": 0.024065000005066395, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_picks_the_matching_geometry_over_a_different_shell": 0.002622899948619306, - "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_recovers_the_in_plane_angle": 0.0027289000572636724, - "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_attached_with_pixel_offsets": 2.2319323000265285, - "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_updates_when_navigator_moves": 2.047208199859597, - "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_crosshair_indices_render_single_frame": 0.003059700015000999, - "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_differs_from_pointer": 0.0047067999839782715, - "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_grid_indices_sum_frames": 0.006447500083595514, - "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_single_cell_grid_equals_render_frame": 0.003090500016696751, - "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_add_vector_vi_computes_from_vectors": 2.483100299956277, - "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_count_vs_intensity_and_shape_change": 2.4458425999619067, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_none_for_4d": 0.09503870003391057, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_reads_source_index": 0.17561179993208498, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_reduce_returns_2d_current_slice_for_stack": 0.183362300042063, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_count_weighting_differs_from_intensity": 0.17384179995860904, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_reduce_to_5d_pushes_and_returns_none": 0.15652579988818616, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_rectangle": 0.1547931000823155, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_returns_full_stack": 0.17408459994476289, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_slice_matches_reduce_for_each_t": 0.1587592998985201, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_add_vvi_spawns_navigable_3d_tree": 1.5032019001664594, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_roi_move_recomputes_full_stack": 1.8065188999753445, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_handles_reversed_corners": 0.0852370000211522, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_image": 0.08766879991162568, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_roi_image_intensity_weighted": 0.09617319994140416, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_absent_on_raw_diffraction": 0.010920499917119741, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_excluded_on_vectors_image": 0.015820199972949922, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_present_on_raw_diffraction": 0.011607599910348654, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_hidden_until_vectors_attach": 0.014615899883210659, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_other_actions_unaffected": 0.011130600003525615, - "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_present_on_vectors_image": 0.009674599976278841, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_4d_result_registers_no_hook": 0.0009966000216081738, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_repeat_of_the_same_slice_does_not_repaint": 0.0012889000354334712, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_moving_time_repaints_the_count_map": 0.0014248000225052238, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_reattaching_does_not_double_paint": 0.0013375998241826892, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_the_time_navigator_gets_per_slice_totals": 0.0012443000450730324, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_an_unpainted_stack_navigator_is_still_found": 0.08721360005438328, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_finalize_never_pushes_a_2d_map_onto_the_1d_navigator": 0.0860541999572888, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_render_fn_goes_to_the_dp_and_the_count_map_to_the_navigator": 0.09594439982902259, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_count_fn_returns_that_slices_count_map": 0.12265039992053062, - "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_intermediate_navigator_is_not_a_signal_plot": 0.09139329998288304, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_picks_current_slice_only": 0.0011054999195039272, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_stale_lead_falls_back": 0.0010871000122278929, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_at_t_matches_series_and_no_crash": 0.0014412999153137207, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_series_is_3d_per_slice": 0.0011811000294983387, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_kxy_at_nav_shape": 0.0013100000796839595, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_n_time_and_shapes": 0.0012512000976130366, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_disk_is_3d": 0.0013964001554995775, - "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_rect_is_3d": 0.0013065000530332327, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_column_names_in_metadata": 0.0042848000302910805, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_empty_vectors_roundtrip": 0.6775068000424653, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_non_vectors_signal_rejected": 0.00267880002502352, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_signal_type_tag": 0.004274599952623248, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_4d": 0.005606900085695088, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_5d": 0.004443099955096841, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_load_reconstructs_result_tree": 0.39896899997256696, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_result_root_is_placeholder_not_rendered": 0.4057060001650825, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_save_picks_dense_carrier": 0.2980694001307711, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_rendered_frame_after_reload": 0.3286429999861866, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_4d": 0.3714223999995738, - "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_5d": 0.5785805000923574, - "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_contrast_from_full_res_not_overview": 0.4248218998545781, - "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_large_frame_auto_enables_tile_mode": 0.4220467999111861, - "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_live_update_swaps_frame_keeps_view": 0.37079880002420396, - "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_small_frame_stays_untiled": 0.013694300083443522, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_figure_has_n_axes": 0.012757399934343994, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_no_data_returns_none": 0.0006761000258848071, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_preserves_window_order_not_click_order": 0.010812500026077032, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_register_views_rgb_and_scalar": 0.011653199908323586, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_emits_one_tiled_figure": 0.012036999920383096, - "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_skips_single_selection": 0.000808900105766952, - "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_add_virtual_image_creates_colored_vi_and_emits_chip": 0.5780010998714715, - "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_colors_cycle_across_adds": 1.2315910998731852, - "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_remove_chip_closes_window_and_drops_it": 0.5455067999428138, - "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_type_change_rebuilds_the_roi_shape": 0.9649029999272898, - "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_update_vi_applies_caret_params_live": 0.7396804000018165, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_returns_all_time_steps": 0.004217399982735515, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_t_filters_correctly": 0.002377399941906333, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_kdtree_t_param": 0.01404280005954206, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_n_time": 0.006507799960672855, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_per_frame_roi_performance": 1.6434589000418782, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_matches_per_t": 0.01024819992017001, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_performance": 2.8514205999672413, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_shape": 0.007646599900908768, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_t_param_isolates_frame": 0.006944700144231319, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_empty_buffer": 0.0008101998828351498, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_sets_internal_tree": 0.002652800176292658, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_direct_roi_performance": 0.12151809979695827, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_build_performance": 0.10671770002227277, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_empty_buffer": 0.0008512000786140561, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_fallback_when_not_built": 0.0016690000193193555, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_annulus": 0.002451400039717555, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_count_mode": 0.00206509989220649, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_large_roi": 0.002969799912534654, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_small_roi": 0.003916400019079447, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_no_hits_in_roi": 0.0015055000549182296, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_query_performance": 0.10708059999160469, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_large_dataset_direct_roi_under_budget": 1.3385733999311924, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_annulus_excludes_inner": 0.001362500013783574, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_count_mode": 0.0013992000604048371, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_empty_buffer_returns_zeros": 0.0008333000587299466, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_intensity_sum_matches_manual": 0.0016883999342098832, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_known_positions_exact": 0.0009200001368299127, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_large_radius_covers_all_vectors": 0.0014384998939931393, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_non_square_nav": 0.0015338999219238758, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_output_shape": 0.004095300100743771, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_single_nav_position": 0.0009500000160187483, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_sum_matches_manual_count": 0.0017972999485209584, - "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_zero_radius_no_hits": 0.002505999873392284, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_start_then_stop": 0.000984800048172474, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_stop_on_exception": 0.0009000999853014946, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_none_window_id_is_a_silent_noop": 0.0008608999196439981, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayErrorPath::test_failed_fill_still_emits_stop": 6.147494200034998, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayNavFill::test_start_then_stop_bracket_the_progressive_nav_fill": 0.6419111000141129, - "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayNavFill::test_stop_message_carries_same_window_id_as_start": 0.6427306000841781, - "spyde/tests/migrated/test_wizard_double_fire.py::TestFindVectorsPreviewDoubleFire::test_strict_mode_leaves_exactly_one_live_preview": 0.608435400063172, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_controllers_declare_parameters": 0.001139800064265728, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_czb_defaults": 0.0011850000591948628, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_fv_defaults_match_action": 0.0011833999305963516, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_om_defaults_match_action": 0.0011508000316098332, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_strain_components": 0.001244500046595931, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_defaults": 0.0011738999746739864, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_fit_defaults": 0.0011807999107986689, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_every_wizard_key_has_a_schema": 0.0019866001093760133, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_schema_is_a_copy": 0.0017278000013902783, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_unknown_key_raises": 0.0017772999126464128, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[czb]": 0.0014146000612527132, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[fv]": 0.002243499970063567, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[om]": 0.0019717998802661896, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[strain]": 0.001420800108462572, - "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[vom]": 0.0014323999639600515, - "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_bare_future": 0.23379620001651347, - "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_future_bearing_object_array": 0.1975493001518771, - "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_still_paints_real_array": 0.21724509994965047, - "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_missing_zspy_emits_error": 0.024677900015376508, - "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_zspy_folder_loads": 0.29422539996448904, - "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_zspy_is_self_describing": 0.0006704999832436442, - "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_dataset_size_walks_zspy_dir": 0.1706016001990065, - "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_missing_zspy_dir_is_not_supported": 0.004015999962575734, - "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_regular_file_still_works": 0.004163899924606085, - "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_dir_is_supported_dataset": 0.2959348999429494, - "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_in_supported_exts": 0.0011391999432817101, - "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_explicit_hspy_extension_kept": 0.24171709991060197, - "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_no_extension_defaults_to_zspy": 0.3920932998880744, - "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_resolves_active_window_when_no_plot": 0.5053908999543637, - "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_signal_writes_zspy_folder": 0.513564599910751 + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_closing_output_window_unmarks_source_action": 0.41732759994920343, + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_deselect_hides_output_window_and_clears_artifact": 0.3840391997946426, + "spyde/tests/migrated/test_action_deselect.py::TestActionDeselect::test_running_region_action_tracks_artifact_and_marks_active": 0.5171621999470517, + "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_generic_dispatch_stores_action_instance": 0.3802026000339538, + "spyde/tests/migrated/test_action_dispatch_state.py::TestActionInstanceTracked::test_update_vi_reaches_generic_action": 0.40496990003157407, + "spyde/tests/migrated/test_action_dispatch_state.py::TestFailedActionUnlightsButton::test_exception_emits_action_active_false": 0.22237609990406781, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_unknown_window_is_noop": 0.001770900096744299, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_forget_window_evicts_view_data": 0.001787200104445219, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_keep_alive_and_forget": 0.0018134999554604292, + "spyde/tests/migrated/test_action_registry.py::TestFigureRegistry::test_session_forget_window_evicts_figures": 0.00900830002501607, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_all_entries_are_dotted_paths": 0.002505199983716011, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_register_staged_adds_entry": 0.001901600044220686, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_staged_imports_handler": 0.001949600176885724, + "spyde/tests/migrated/test_action_registry.py::TestStagedHandlersTable::test_resolve_unknown_returns_none": 0.0018854999216273427, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_close_window_routes_controller_backed_window": 0.00771739985793829, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_controller_close_exception_is_swallowed": 0.008186399820260704, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_forget_window_closes_and_evicts": 0.007734999991953373, + "spyde/tests/migrated/test_action_registry.py::TestWindowControllerRegistry::test_register_and_lookup": 0.009318500058725476, + "spyde/tests/migrated/test_api_layer.py::TestApiCenterZeroBeam::test_center_zero_beam_smoke": 0.054389200173318386, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_find_vectors_headless": 0.4163286999100819, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_provenance_stamped": 0.0017106999875977635, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_map_default_reference": 0.006212499924004078, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_strain_reference_is_zero_beam_filtered": 0.002167999977245927, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_vector_virtual_image": 0.002068999921903014, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_empty_detector_raises": 0.0009117999579757452, + "spyde/tests/migrated/test_api_layer.py::TestApiFindVectorsAndDownstream::test_virtual_image_signal2d": 0.0051657999865710735, + "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_import_pulls_no_ui_stack": 0.8142193999374285, + "spyde/tests/migrated/test_api_layer.py::TestApiImportGraph::test_api_source_never_imports_backend_or_drawing": 0.012227299856022, + "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_api_surface_complete": 0.0008819999638944864, + "spyde/tests/migrated/test_api_layer.py::TestClientSeam::test_batch_cores_accept_client": 0.0010248000035062432, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderDeclinesArbitraryPositions::test_positions_true_returns_none": 0.011916999937966466, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_fast_path_disabled_without_os_pread": 0.2698939999099821, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frame_bytes": 0.019113099901005626, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_frames_are_correct_on_any_platform": 0.03432870004326105, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderFastPathVsFallback::test_pread_matches_memmap_fallback": 0.00044430000707507133, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestBinaryReaderMultiDimNav::test_2d_nav_flat_index_matches_expected_frame": 0.013721599942073226, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestCloseAllReaders::test_closes_and_clears_plot_readers": 0.010820800089277327, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_base_array_still_resolves_binary": 0.0174620000179857, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_derived_read_through_resolve_reader_matches_compute": 0.01941479998640716, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_nav_crop_declines": 0.005209100083447993, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestDerivedViewMustNotResolveBinary::test_signal_rebin_declines": 0.005877799936570227, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_byte_identical_to_compute": 0.03518079989589751, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_extracts_correct_kwargs_and_offset": 0.0373885000590235, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestFindMemmapSourceRealMRC::test_no_memmap_source_for_non_memmap_array": 0.001058800145983696, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_is_safe_on_any_platform": 0.010362199973315, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestReaderCleanup::test_close_releases_fd": 0.0004316001432016492, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_falls_back_to_local_transform_for_derived_view": 0.0015636999160051346, + "spyde/tests/migrated/test_array_cache_binary_reader.py::TestResolveReaderFallback::test_resolves_binary_reader_for_memmap_backed": 0.019199699978344142, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_byte_accounting_survives_concurrent_readers": 0.030373599962331355, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_lru_evicts_oldest_over_budget": 0.001260800170712173, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_single_entry_over_budget_still_served": 0.0011802000226452947, + "spyde/tests/migrated/test_array_cache_core.py::TestByteBudgetEviction::test_touching_a_frame_protects_it_from_eviction": 0.0011146001052111387, + "spyde/tests/migrated/test_array_cache_core.py::TestClear::test_clear_drops_everything": 0.0011078000534325838, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_different_indices_is_a_miss": 0.0011622000019997358, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_first_read_is_a_miss": 0.0011976000387221575, + "spyde/tests/migrated/test_array_cache_core.py::TestHitMiss::test_second_read_same_indices_is_a_hit_no_reader_call": 0.0011974000371992588, + "spyde/tests/migrated/test_array_cache_core.py::TestKeyInvalidation::test_different_key_misses_even_for_same_indices": 0.0010615999344736338, + "spyde/tests/migrated/test_array_cache_core.py::TestResidentProbe::test_is_resident_never_calls_reader": 0.0010846001096069813, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_rebin_of_lazy_movie_uses_array_cache": 0.4695021000225097, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestDirectReadFrameLocalityGating::test_untagged_transform_falls_through_not_cached": 0.38652499997988343, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_data_swap_on_the_same_signal_drops_stale_frames": 0.007932099979370832, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_local_signal_populates_array_cache": 0.0040200999937951565, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_opaque_signal_returns_none": 0.001886499929241836, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_matches_per_frame_sum_across_a_block_boundary": 0.011287699919193983, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_returns_frame_wise_mean": 0.00834859989117831, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_region_sums_from_the_block_not_frame_by_frame": 0.004444000078365207, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_is_chunk_granular": 0.003915000008419156, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestGetLocalFrameThroughArrayCache::test_residency_probe_never_creates_a_reader": 0.001878799987025559, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_bytes": 0.001854000031016767, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_frame_parity_and_chunk_memo_reuse": 0.012867399957031012, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_is_chunk_resident_tracks_the_memo": 0.004484400036744773, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader1D::test_returned_frame_does_not_retain_the_decoded_chunk": 0.007824599975720048, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestLocalTransformReader2D::test_2d_nav_frame_parity_and_memo": 0.008033000049181283, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_1d_mapping": 0.0015841999556869268, + "spyde/tests/migrated/test_array_cache_local_reader.py::TestNavChunkSpan::test_uneven_last_chunk": 0.0015162000199779868, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_chunked_source_memoizes_the_nav_block": 0.20471980003640056, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_is_chunk_resident_tracks_the_memo": 0.20202229998540133, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_oversized_block_falls_back_to_frame_reads": 0.19708429998718202, + "spyde/tests/migrated/test_array_cache_source_array.py::TestBlockMemo::test_single_frame_chunk_does_not_memoize": 0.23354220006149262, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_derived_frames_are_the_transformed_ones": 0.039771700045093894, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_nav_crop_declines_and_falls_back": 0.036237700027413666, + "spyde/tests/migrated/test_array_cache_source_array.py::TestDerivedViewsDecline::test_signal_rebin_declines_and_falls_back": 0.18972770008258522, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_hspy_yields_h5py_dataset": 0.19469780009239912, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_in_ram_ndarray_source_declines": 0.001195400021970272, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_memmap_source_is_accepted": 0.015936799929477274, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFindSourceArray::test_zspy_yields_zarr_array": 0.5672985999844968, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_1d_nav_movie_frames_match": 0.04692189989145845, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_hspy_frames_match_compute": 0.04454129992518574, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_returned_frame_owns_its_memory": 0.00663910002913326, + "spyde/tests/migrated/test_array_cache_source_array.py::TestFrameParity::test_zspy_frames_match_compute": 0.22330549999605864, + "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_hspy_resolves_source_array_reader": 0.035441799904219806, + "spyde/tests/migrated/test_array_cache_source_array.py::TestResolveOrdering::test_zspy_resolves_source_array_reader": 0.20669849996920675, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_atoms_locates_the_lattice": 0.0020392999285832047, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_find_then_refine_recovers_the_truth": 0.001658199937082827, + "spyde/tests/migrated/test_atoms.py::TestAtomapIntegration::test_missing_extra_gives_the_install_line": 0.001040400005877018, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_does_not_move_an_already_centred_atom_much": 0.0010694001102820039, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_handles_atoms_near_the_edge": 0.0009163001086562872, + "spyde/tests/migrated/test_atoms.py::TestCenterOfMass::test_pulls_a_jittered_guess_back_toward_the_atom": 0.02361919987015426, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_a_runaway_fit_keeps_its_input_position": 0.003980400040745735, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_all_atoms_pinned_is_a_no_op": 0.0009035000111907721, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_ellipticity_is_recovered_when_present": 0.030587999965064228, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_mask_length_is_checked": 0.0008529998594895005, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_pinned_atoms_keep_their_position_exactly": 0.039794000098481774, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_positions_to_sub_pixel": 0.06863630004227161, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_recovers_the_known_widths": 0.014138900092802942, + "spyde/tests/migrated/test_atoms.py::TestGaussianRefinement::test_two_step_beats_the_gaussian_alone_from_a_poor_start": 0.09989519999362528, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_finds_a_real_distortion": 0.039166999980807304, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_displacement_is_zero_on_a_perfect_lattice": 0.001036600093357265, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_does_not_flip_with_orientation": 0.0013475000159814954, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_ellipticity_is_at_least_one": 0.01474289980251342, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_intensity_is_the_fitted_volume": 0.014583899988792837, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_nn_distance_matches_the_lattice_spacing": 0.0013828999362885952, + "spyde/tests/migrated/test_atoms.py::TestPropertyMaps::test_property_maps_returns_one_value_per_atom": 0.016111499979160726, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_atoms_outside_the_shape_are_dropped_not_wrapped": 0.0010450000409036875, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_length_mismatch_is_caught": 0.001067599980160594, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_pixels_without_an_atom_are_nan": 0.0010529999854043126, + "spyde/tests/migrated/test_atoms.py::TestToMap::test_places_values_at_their_atoms": 0.0010495999595150352, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_does_not_cancel_to_zero": 0.0010590001475065947, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_max_separation_rejects_a_non_dumbbell_lattice": 0.0009818999096751213, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_direction": 0.0010242999996989965, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_recovers_the_known_separation": 0.04401589999906719, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_too_few_atoms_is_an_error": 0.0007990000303834677, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestEstimateVector::test_works_for_a_diagonal_dumbbell": 0.0010593000333756208, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_accepts_an_explicit_vector": 0.0011489999014884233, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_end_to_end_from_the_image": 0.028950899955816567, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_independent_fits_underestimate_the_separation": 0.02768950001336634, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_beats_independent_fitting": 0.055334100034087896, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_joint_fitting_recovers_the_true_separation": 0.031040299916639924, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_reports_the_vector_it_used": 0.0017253000987693667, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestFullWorkflow::test_survives_refinement_jitter": 0.0016646998701617122, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_a_wrong_vector_leaves_atoms_unpaired": 0.0009529000381007791, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_an_odd_atom_out_is_reported_not_dropped": 0.0009603998623788357, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_no_atom_is_claimed_twice": 0.0012919001746922731, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_pairs_every_atom_on_a_clean_lattice": 0.00133500003721565, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_partners_are_the_real_partners": 0.0014461000682786107, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestPairing::test_zero_vector_is_rejected": 0.0008300000336021185, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_is_folded_to_a_half_turn": 0.0007872000569477677, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_angle_tracks_a_real_rotation": 0.0007878999458625913, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_centre_is_the_midpoint": 0.0008238999871537089, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_intensity_ratio_distinguishes_the_two_sites": 0.0008325999369844794, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_one_value_per_pair_not_per_atom": 0.001299800118431449, + "spyde/tests/migrated/test_atoms_dumbbell.py::TestProperties::test_separation_matches_the_truth": 0.0015365000581368804, + "spyde/tests/migrated/test_axes.py::TestAxes::test_axes_info_emitted_on_load": 0.20240979979280382, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_ignores_garbage_numeric": 0.22627360001206398, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_name_and_units": 0.23176059999968857, + "spyde/tests/migrated/test_axes.py::TestAxes::test_set_axis_scale_writes_back_and_reemits": 0.2073059999383986, + "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_scale_edit_preserves_origin_pixel": 0.22826120001263916, + "spyde/tests/migrated/test_axes_edit.py::TestAxesEdit::test_set_axis_writes_back_and_re_emits": 0.23294680006802082, + "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_a_live_move_does_not_emit_state": 0.14225049992091954, + "spyde/tests/migrated/test_background_drag.py::TestDragCost::test_the_release_emits_state": 0.15285200020298362, + "spyde/tests/migrated/test_background_drag.py::TestScoping::test_closing_removes_the_band_and_the_curve": 0.15571159997489303, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_a_window_right_of_the_peak_does_not_explode": 0.30925190006382763, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_it_is_left_at_zero_when_the_axis_does_not_reach_it": 0.09869070013519377, + "spyde/tests/migrated/test_background_drag.py::TestTheCurveStaysOnScale::test_the_origin_is_moved_off_a_zero_based_axis": 0.1840739999897778, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_a_dict_event_works_too": 0.18913319997955114, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_an_event_without_a_source_is_ignored": 0.09001350007019937, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_geometry_comes_off_event_source": 0.2891421001404524, + "spyde/tests/migrated/test_background_drag.py::TestTheDragIsHeard::test_the_window_is_normalised": 0.19959940004628152, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_only_one_background_line_exists": 0.2723785999696702, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_curve_changes_when_the_band_moves": 0.16583350009750575, + "spyde/tests/migrated/test_background_drag.py::TestThePreviewFollows::test_the_line_is_updated_in_place_not_rebuilt": 0.37389980000443757, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_contains_is_side_effect_free": 0.002550699980929494, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_keys_are_scoped_per_owner": 0.001657299930229783, + "spyde/tests/migrated/test_block_cache.py::TestBlockCacheBasics::test_miss_then_hit": 0.0013503999216482043, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_clear_resets_accounting": 0.0017188999336212873, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_drop_owner_leaves_others": 0.0019533999729901552, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_evicts_lru_over_budget": 0.0020942999981343746, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_hit_refreshes_recency": 0.0021751999156549573, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_oversized_block_still_served": 0.002244099974632263, + "spyde/tests/migrated/test_block_cache.py::TestEviction::test_region_span_stays_resident": 0.07522780005820096, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_is_idempotent": 0.00134860014077276, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_demote_shrinks_but_keeps_working_set": 0.3405644999584183, + "spyde/tests/migrated/test_block_cache.py::TestFocusBudget::test_restore_returns_full_budget": 0.0007224999135360122, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_int32_region_mean_is_accurate": 0.0013921000063419342, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float16]": 0.0009283999679610133, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[float32]": 0.0009052000241354108, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[int16]": 0.0014165998436510563, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_narrow_dtypes_use_float32[uint8]": 0.002106600091792643, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_above_the_cap_falls_back": 0.0018860999261960387, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_uint16_at_the_cap_uses_float32": 0.0018980999011546373, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[float64]": 0.002072500064969063, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[int32]": 0.002206199918873608, + "spyde/tests/migrated/test_block_cache.py::TestRegionAccumulatorDtype::test_wide_dtypes_use_float64[uint32]": 0.0021579000167548656, + "spyde/tests/migrated/test_block_cache.py::TestThreadSafety::test_concurrent_put_keeps_accounting_consistent": 0.0602765001822263, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_client_none_is_honoured": 0.01648440002463758, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_explicit_client_still_returned": 0.014742500148713589, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_idempotent": 0.0007549000438302755, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_patch_applied": 0.000758600072003901, + "spyde/tests/migrated/test_cache_client_patch.py::TestCacheClientPatch::test_synchronous_read_returns_correct_frame": 0.015338600147515535, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_activating_automatic_tab_shows_full_frame_box_immediately": 0.22799180005677044, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_centers_beam": 0.3222551998915151, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_auto_region_shows_draggable_widget_and_run_uses_it": 0.3174456999404356, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_manual_center_from_crosshair": 0.34367999993264675, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_node_switch_tears_down_region_and_markers": 0.21708740014582872, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_drag_handler_runs_once_per_event": 0.21566580003127456, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_region_widget_torn_down_on_close": 0.20912540005519986, + "spyde/tests/migrated/test_center_zero_beam.py::TestCenterZeroBeam::test_tree_close_tears_down_region_widgets": 0.24437299999408424, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_batched_submit_prime_then_bulk": 0.07806949981022626, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancel_stops_the_dispatch": 0.014788399916142225, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_cancelled_handle_is_not_delivered": 0.001956599997356534, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_one_cancellable_handle_registered": 0.02976109995506704, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_plot_update_worker_accepts_the_handle": 0.001890599844045937, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_result_is_assembled_not_recomputed": 0.033369499957188964, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_submits_unpinned": 0.02707200008444488, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNavigatorFillThroughDispatcher::test_worker_finds_the_handle_through_hyperspys_data_setter": 0.008017199928872287, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_client_submit_inside_a_loop_outside_the_dispatcher": 1.2806592000415549, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_no_second_whole_array_compute_in_the_nav_fill": 0.0012906999327242374, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_guard_actually_catches_the_pattern": 0.0008163999300450087, + "spyde/tests/migrated/test_chunk_dispatch_guard.py::TestNoPerChunkSubmitLoops::test_the_navigator_fill_calls_the_dispatcher": 0.0030279000056907535, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_balanced_cube_splits_the_signal": 0.012964599998667836, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_a_one_frame_per_chunk_movie_is_not_split": 0.010673300013877451, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_eager_data_has_no_chunking": 0.0065055000595748425, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_long_chunk_lists_are_truncated_but_counted": 0.011639000033028424, + "spyde/tests/migrated/test_chunk_info.py::TestChunkInfo::test_storage_aligned_chunks_are_not_split": 0.013169500045478344, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_closing_unknown_window_still_notifies_renderer": 0.00855919998139143, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_lone_signal_window_closes_its_tree": 0.18224180000834167, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_navigator_close_closes_the_whole_tree": 0.21206679998431355, + "spyde/tests/migrated/test_close.py::TestCloseWindow::test_signal_close_closes_only_that_window": 0.23024820000864565, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_close_flips_registered_flag_and_cancels_future": 0.2153429000172764, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_register_on_already_closed_tree_flips_immediately": 0.22883950010873377, + "spyde/tests/migrated/test_close.py::TestComputeCancellationRegistry::test_unregister_drops_from_registry": 0.22718529996927828, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_attrs_and_provenance": 0.027823299984447658, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_creates_exactly_one_tree_with_views": 0.07021949999034405, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_on_tree_hook_runs_and_failure_is_swallowed": 0.0499005998717621, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_rgb_primary_autolevels_without_clim": 0.02994329994544387, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_root_signal_carries_primary_data": 0.05794099986087531, + "spyde/tests/migrated/test_commit_tree.py::TestCommitResultTree::test_view_data_evicted_when_window_closes": 0.058467599912546575, + "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_accepts_prepared_signal_and_signal_type": 0.034117299946956336, + "spyde/tests/migrated/test_commit_tree.py::TestOpenResultTree::test_opens_new_tree_with_title_and_provenance": 0.03885529993567616, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_live_search_silver": 2.2709759999997914, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_emits_results": 0.0009189998963847756, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_cod_search_handles_network_error": 0.0009073998080566525, + "spyde/tests/migrated/test_composition.py::TestCodNetwork::test_fetch_cod_cif_writes_file": 0.02589580009225756, + "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_dedupes_and_sorts_by_cell": 0.0008195999544113874, + "spyde/tests/migrated/test_composition.py::TestCodTidy::test_tidy_skips_rows_without_a_cell": 0.0007619999814778566, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_read_empty": 0.0028266001027077436, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_set_composition_handler_writes_and_emits": 0.00921310018748045, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_read_roundtrip": 0.003520399914123118, + "spyde/tests/migrated/test_composition.py::TestCompositionMetadata::test_write_without_percentages": 0.0030610000248998404, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_apply_sets_env_persists_and_restarts": 0.01814370008651167, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_empty_payload_is_a_noop": 0.001257999916560948, + "spyde/tests/migrated/test_compute_config.py::TestComputeConfigure::test_values_clamped_and_bad_gpu_defaulted": 0.0016957999905571342, + "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_current_config_reads_env": 0.001412999932654202, + "spyde/tests/migrated/test_compute_config.py::TestPersistedEnv::test_startup_loads_settings_env_wins": 0.032062700018286705, + "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_is_side_effect_free": 0.018646299955435097, + "spyde/tests/migrated/test_console.py::TestCompletion::test_attribute_completion_one_level": 0.029404599918052554, + "spyde/tests/migrated/test_console.py::TestCompletion::test_builtin_names_complete": 0.033892299979925156, + "spyde/tests/migrated/test_console.py::TestCompletion::test_prefix_completion": 0.03685970010701567, + "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_action_dispatch": 0.019600499887019396, + "spyde/tests/migrated/test_console.py::TestDispatchWiring::test_console_exec_via_app_command_envelope": 0.020952200051397085, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_assignment_registers_name_but_echoes_nothing": 0.029568200116045773, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_expression_echoes_value_and_registers_out": 0.03137770004104823, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_multi_statement_with_trailing_expression": 0.019503000075928867, + "spyde/tests/migrated/test_console.py::TestEchoAndRegistration::test_none_valued_expression_registers_no_out": 0.018292800057679415, + "spyde/tests/migrated/test_console.py::TestErrors::test_name_error_surfaces": 0.019500199938192964, + "spyde/tests/migrated/test_console.py::TestErrors::test_runtime_error_reports_traceback_and_keeps_namespace": 0.0412729000672698, + "spyde/tests/migrated/test_console.py::TestErrors::test_syntax_error_reports_ok_false": 0.018616900080814958, + "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_dask_array_expression_reports_lazy": 0.020808200002647936, + "spyde/tests/migrated/test_console.py::TestLazyNeverComputes::test_lazy_signal_comparison_stays_lazy": 0.12460159999318421, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_1d_ndarray_is_signal1d": 0.056740700150839984, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_lazy_result_stays_lazy": 0.45383330003824085, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_ndarray_creates_tree": 0.05927960004191846, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_materialise_scalar_refuses_politely": 0.026216200087219477, + "spyde/tests/migrated/test_console.py::TestMaterialisation::test_show_helper_opens_window": 0.040202299947850406, + "spyde/tests/migrated/test_console.py::TestNamespace::test_hs_and_da_available": 0.031154700089246035, + "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_array_expression_kind_ndarray": 0.02004650013986975, + "spyde/tests/migrated/test_console.py::TestNamespace::test_numpy_available": 0.018965099938213825, + "spyde/tests/migrated/test_console.py::TestNamespace::test_persistence_across_execs": 0.036428799969144166, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_assigned_var": 0.04740219993982464, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_out_chip": 0.035839500138536096, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_signal_binding_noop": 0.24305569985881448, + "spyde/tests/migrated/test_console.py::TestRemoveVar::test_remove_via_action_dispatch": 0.04133459983859211, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_binding_removed_on_tree_close": 0.2589653000468388, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_positional_aliases_track_load_order": 0.08463499997742474, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_binding_has_window_ids": 0.23702050000429153, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_signal_exposed_as_name_and_positional_alias": 0.24323069991078228, + "spyde/tests/migrated/test_console.py::TestSignalBindings::test_titled_signal_gets_sanitized_name": 0.05981809995137155, + "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_captured": 0.020214600139297545, + "spyde/tests/migrated/test_console.py::TestStdout::test_stdout_with_trailing_expression": 0.020327200065366924, + "spyde/tests/migrated/test_console.py::TestVarsSchema::test_out_chip_appears_in_vars": 0.01989220001269132, + "spyde/tests/migrated/test_console.py::TestVarsSchema::test_vars_schema_exact": 0.2349102001171559, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(a, b)-True]": 0.0017391000874340534, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[(x := 1)-False]": 0.001240600016899407, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[-s1 + 2 * b-True]": 0.0017685000784695148, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[i for i in s1]-False]": 0.001288300147280097, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[[s1]-False]": 0.0012722001411020756, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a and not b-True]": 0.0017443998949602246, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[a if b else c-False]": 0.0012755999341607094, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[f'{s1}'-False]": 0.0012391998898237944, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[lambda: 1-False]": 0.0012397000100463629, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[np.log(s1)-False]": 0.0012711999006569386, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1 > 100-True]": 0.0017100999830290675, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.data-True]": 0.0016329999780282378, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum()-False]": 0.0014852999011054635, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum(axis=(0,1))-False]": 0.0013053000438958406, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1.sum-True]": 0.0017426999984309077, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0:2, ::2]-True]": 0.0016900000628083944, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[s1[0]-True]": 0.0016385000199079514, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[x = 1-False]": 0.0012554998975247145, + "spyde/tests/migrated/test_console_preview.py::TestAutoTierClassifier::test_auto_safe[{'a': 1}-False]": 0.0012556000147014856, + "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_exec_cancels_queued_preview": 0.9216153000015765, + "spyde/tests/migrated/test_console_preview.py::TestCoalescing::test_superseded_preview_never_emits": 0.91463220003061, + "spyde/tests/migrated/test_console_preview.py::TestCostGuard::test_nav_sum_is_too_expensive": 0.30506569996941835, + "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_no_selector_falls_back_to_frame_zero": 0.2566528001334518, + "spyde/tests/migrated/test_console_preview.py::TestNavPositionResolution::test_thumbnail_reflects_cursor": 0.24555550003424287, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_exec_clears_nav_refresh": 0.33193409990053624, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_explicit_preview_not_nav_tracked": 0.3206319999881089, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_hook_registered_and_removed": 0.008540499955415726, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_nav_move_reemits_at_new_cursor": 0.2657384000485763, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_run_update_fires_hook_only_on_change": 0.24392800009809434, + "spyde/tests/migrated/test_console_preview.py::TestNavRefresh::test_stop_clears_nav_refresh": 0.32090370007790625, + "spyde/tests/migrated/test_console_preview.py::TestPreviewNeverComputesFull::test_lazy_comparison_previews_one_frame": 0.2578323999186978, + "spyde/tests/migrated/test_console_preview.py::TestPreviewSideEffectFree::test_no_chips_no_console_result": 0.018489399924874306, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_image_thumbnail_matches_pipeline": 0.25087829993572086, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_scalar": 0.020609800005331635, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_nan_becomes_null": 0.04274429997894913, + "spyde/tests/migrated/test_console_preview.py::TestRenderKinds::test_sparkline_strided_and_capped": 0.03868779994081706, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_explicit_autolevel_recomputes": 0.001281399978324771, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_checkerboard_placeholder": 0.0011303999926894903, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frame_holds_on_zero_frame": 0.0010593000333756208, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_navigated_frames_hold_contrast": 0.0012034999672323465, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_relevels_each_recompute": 0.00127730006352067, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_output_plot_still_paints_blank_frame": 0.0013689000625163317, + "spyde/tests/migrated/test_contrast_hold.py::TestContrastHold::test_user_clim_is_held_across_navigated_frames": 0.0011044000275433064, + "spyde/tests/migrated/test_crop_action.py::TestCropInToolbar::test_crop_available_on_a_2d_signal_plot": 0.2516561000375077, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_close_tears_down_widget_without_running": 0.21124490012880415, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_drag_clamp_handler_runs_once_per_event": 0.2045601001009345, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_full_frame_widget_is_a_noop_run": 0.21524740010499954, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_node_switch_tears_down_widget": 0.23286280001048, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_open_shows_draggable_widget_covering_full_frame": 0.20732859999407083, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_tree_close_tears_down_widget": 0.229695999994874, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_typed_field_edit_moves_the_widget": 0.22613069997169077, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_drives_a_nonsquare_crop": 0.34351410006638616, + "spyde/tests/migrated/test_crop_action.py::TestCropROI::test_widget_partially_out_of_bounds_is_clamped": 0.3480824999278411, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_all_zero_crop_is_a_noop": 0.010444700019434094, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_crop_preserves_values": 0.007908999919891357, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_out_of_range_end_is_clamped": 0.015170099795795977, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_and_time_crop": 0.028782299952581525, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_spatial_crop_only_lazy": 0.020792300114408135, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_start_at_zero_is_a_real_crop_not_full": 0.013131999992765486, + "spyde/tests/migrated/test_crop_action.py::TestCropSlicing::test_zero_spatial_ranges_keep_full_frame": 0.013212399906478822, + "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_adds_a_cropped_node": 0.37961870001163334, + "spyde/tests/migrated/test_crop_action.py::TestCropThroughAction::test_run_keeps_a_lazy_movie_lazy": 0.38601900008507073, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[cpu-numba]": 0.8215569998137653, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_matches_numpy_bit_for_bit[gpu]": 0.008032799931243062, + "spyde/tests/migrated/test_csb_events.py::TestBackendParity::test_torch_matches_numpy_bit_for_bit": 0.20409520016983151, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_frame_lands_where_the_arithmetic_says": 0.022195499972440302, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_a_partial_edge_block_is_cropped_not_wrapped": 0.013940599979832768, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[0]": 0.021128899999894202, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_block_ordering[1]": 0.017009900067932904, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_repeated_events_on_one_pixel_add": 0.012203900027088821, + "spyde/tests/migrated/test_csb_events.py::TestEventDecoding::test_the_reference_decoder_agrees": 0.007527800160460174, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad0]": 0.005816199933178723, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad1]": 0.005850600078701973, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad2]": 0.005587899941019714, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_bad_range_is_refused[bad3]": 0.0055822000140324235, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-1]": 0.006008999887853861, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-2]": 0.005921600037254393, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[0-4]": 0.008161699865013361, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[1-3]": 0.005731899873353541, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_a_range_sums_those_frames_and_no_others[3-4]": 0.005854699993506074, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[2]": 0.006162199890241027, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_binning_equals_box_summing_the_unbinned[4]": 0.006307999836280942, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_plane_counts_match_the_decoded_frames": 0.005784400040283799, + "spyde/tests/migrated/test_csb_events.py::TestIntegration::test_ranges_are_additive": 0.007011299952864647, + "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_an_explicit_cpu_backend_is_passed_through": 0.00877140008378774, + "spyde/tests/migrated/test_csb_reader.py::TestBackendSelection::test_torch_without_a_device_falls_back_and_still_integrates": 0.0064455000683665276, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_a_partial_edge_block_keeps_its_stride": 0.017971000052057207, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_an_empty_payload_reads_as_zero_events": 0.006637400132603943, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_block_grid_and_padding": 0.006341599975712597, + "spyde/tests/migrated/test_csb_reader.py::TestHeader::test_fields_come_back_off_the_documented_offsets": 0.009297999902628362, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_each_block_is_exactly_one_plane": 0.03102230012882501, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_reading_one_plane_does_not_compute_the_others": 0.019738299888558686, + "spyde/tests/migrated/test_csb_reader.py::TestLazyStackChunking::test_the_exposure_does_not_change_the_block_shape": 0.011996900080703199, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_matching_path_shows_the_action": 0.0008917999221011996, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_raising_lookup_is_refused_not_propagated": 0.0007535000331699848, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_a_signal_without_original_metadata_is_refused": 0.0007038000039756298, + "spyde/tests/migrated/test_csb_reader.py::TestOriginalMetadataGate::test_no_gate_means_always_visible": 0.0006949000526219606, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_apply_registers_and_is_idempotent": 0.0008276998996734619, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_csb_is_an_openable_extension": 0.0006969998357817531, + "spyde/tests/migrated/test_csb_reader.py::TestRegistration::test_spec_matches_the_yaml": 0.0024404999567195773, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_short_file": 0.004462899873033166, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_truncated_block_table": 0.018554699956439435, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_wrong_magic": 0.01792139990720898, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw0]": 0.0216269000666216, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw1]": 0.01583239994943142, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw2]": 0.013431400060653687, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw3]": 0.014936799998395145, + "spyde/tests/migrated/test_csb_reader.py::TestRejects::test_a_zero_dimension[kw4]": 0.01251949998550117, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_it_does_not_touch_the_process_tree": 0.0009890999644994736, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_repeated_shutdown_stays_cheap": 0.001511499984189868, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestNothingStarted::test_shutdown_is_immediate_when_start_was_never_called": 0.0010884000221267343, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_live_cluster_still_reaps_even_without_the_thread": 0.49009450001176447, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_a_started_manager_still_reaps": 0.392348799854517, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_client]": 0.3513407999416813, + "spyde/tests/migrated/test_dask_shutdown_fast.py::TestSomethingStarted::test_either_handle_alone_is_enough_to_reap[_cluster]": 0.391713900025934, + "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_shape_and_sums": 0.0018698000349104404, + "spyde/tests/migrated/test_dask_stats.py::TestBuildStats::test_tolerates_missing_fields": 0.0007186001166701317, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_missing_nvidia_smi_disables_permanently": 0.0008549999911338091, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_parses_nvidia_smi": 0.0008326000533998013, + "spyde/tests/migrated/test_dask_stats.py::TestGpuProbe::test_transient_failure_keeps_last_reading": 0.0008648999501019716, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_cluster_mem_frac": 0.0007116999477148056, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_lane_cap_shrinks_when_hot": 0.0006977999582886696, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryBackpressure::test_worker_memory_limit": 0.0008996000979095697, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_auto_trim_runs_on_workers": 0.33252399996854365, + "spyde/tests/migrated/test_dask_stats.py::TestMemoryTrim::test_trim_runs_and_reports_rss": 0.34366819995921105, + "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_positive_still_blurs": 0.0034729999024420977, + "spyde/tests/migrated/test_dask_stats.py::TestNavBlurNoCopy::test_sigma_zero_returns_raw_block_no_copy": 0.001974599785171449, + "spyde/tests/migrated/test_dask_stats.py::TestSampler::test_emits_from_fake_client": 0.07570279994979501, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_budget_is_75_percent_of_cores": 0.0008472000481560826, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPlan::test_fraction_override_and_clamp": 0.0008363000815734267, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_drops_to_below_normal": 0.0007803000044077635, + "spyde/tests/migrated/test_dask_stats.py::TestWorkerPriority::test_opt_out": 0.0008344000671058893, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_displays_real_data": 0.17563029995653778, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_2d_signal_opens_one_window": 0.16218889993615448, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_diffraction_pattern_fills_with_real_data": 0.22254389990121126, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_navigator_fills_with_real_data": 0.20750659995246679, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_4d_stem_opens_navigator_and_signal": 0.2511712000705302, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_histogram_emitted": 0.20099889999255538, + "spyde/tests/migrated/test_dataflow.py::TestDataFlow::test_metadata_emitted": 0.20960549998562783, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_holds_lock_on_mps": 0.003220000071451068, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_noop_off_mps": 0.004884600057266653, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_released_on_exception": 0.002950599999167025, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_serialises_two_threads": 0.029763299855403602, + "spyde/tests/migrated/test_device_lock.py::TestAcceleratorLock::test_syncs_before_release": 0.0009539999300613999, + "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_calibration_locks": 0.0025013999547809362, + "spyde/tests/migrated/test_device_lock.py::TestNeuralPathsTakeLock::test_single_frame_preview_locks": 0.0021955998381599784, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_fit_runs_under_the_lock": 0.003622999880462885, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_no_deadlock_against_concurrent_users": 0.026501499814912677, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_off_mps_is_a_passthrough": 0.0021693998714908957, + "spyde/tests/migrated/test_device_lock.py::TestOrientationFitTakesLock::test_yield_hands_the_device_back": 0.0050431001000106335, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_find_vectors_torch_reuses_the_shared_lock": 0.0008052999619394541, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_lock_is_reentrant": 0.0028296001255512238, + "spyde/tests/migrated/test_device_lock.py::TestSharedLockIdentity::test_mps_forward_lock_is_the_shared_lock": 0.0018499998841434717, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_average_dot_product_map_locks": 0.0023919999366626143, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_dictionary_index_locks": 0.0021201000781729817, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_fit_batched_locks_every_chunk": 0.29075629997532815, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_remove_background_locks": 0.00487320008687675, + "spyde/tests/migrated/test_device_lock.py::TestZeroThreeZeroPathsTakeLock::test_the_live_single_pattern_match_locks": 0.0014893999323248863, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_band_that_misses_the_detector_is_dropped": 0.0020878000650554895, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_a_wrong_orientation_does_not_land_on_them": 0.017670700093731284, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_every_line_sits_on_a_local_intensity_peak": 0.02008149994071573, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_max_bands_keeps_the_strongest": 0.0021813000785186887, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_pixel_convention_is_centre_on_integer": 0.0015367999440059066, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_are_the_line_collection_shape": 0.0015103999758139253, + "spyde/tests/migrated/test_ebsd_bands.py::TestBandLinesLandOnBands::test_segments_stay_inside_the_detector": 0.0016330999787896872, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_a_sample_rotation_does_change_the_pattern": 0.005288999993354082, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_crystal_symmetry_leaves_the_pattern_alone": 0.015437200083397329, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_euler_matrix_matches_orix": 0.0015910000074654818, + "spyde/tests/migrated/test_ebsd_bands.py::TestConventionAgreesWithOrix::test_normals_to_sample_is_the_transpose": 0.0015505999326705933, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_directions_are_unit_vectors": 0.001167000038549304, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_detector_y_is_flipped": 0.0009631998836994171, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_reflectors_dataclass_broadcasts_scalars": 0.0006610999116674066, + "spyde/tests/migrated/test_ebsd_bands.py::TestGeometryBasics::test_wavelength_is_relativistic": 0.0006463001482188702, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_a_structureless_phase_falls_back": 0.02002699999138713, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_is_a_subset": 0.0012295999331399798, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_brightest_none_is_a_no_op": 0.0009850999340415, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_cubic_set_is_friedel_unique": 0.0010366999777033925, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_from_a_real_phase": 0.209731699898839, + "spyde/tests/migrated/test_ebsd_bands.py::TestReflectors::test_widths_and_weights_are_per_reflector": 0.0009874999523162842, + "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_axes_fall_where_bands_cross": 0.00407450005877763, + "spyde/tests/migrated/test_ebsd_bands.py::TestZoneAxes::test_points_stay_on_the_detector": 0.002873399993404746, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestAgainstLiveKikuchipy::test_reference_still_matches_kikuchipy": 0.001639300025999546, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_a_square_detector_is_unaffected_by_the_aspect_ratio": 0.003801899845711887, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[nonsquare-60x80]": 0.0042818000074476, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_band_line_pixels_satisfy_the_relation[square-60x60]": 0.004382200073450804, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape0-pc0]": 0.001711800112389028, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_detector_directions_satisfy_the_relation[shape1-pc1]": 0.0017356000607833266, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape0-pc0]": 0.004448399995453656, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestBrukerConventionHoldsEverywhere::test_zone_axes_satisfy_the_relation[shape1-pc1]": 0.0044151999754831195, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[nonsquare-60x80]": 0.004415900097228587, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_band_lines_match[square-60x60]": 0.004402099992148578, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[nonsquare-60x80]": 0.004439600044861436, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestMatchesKikuchipy::test_line_directions_match[square-60x60]": 0.0042822001269087195, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-both]": 0.004918999969959259, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-x]": 0.00468640006147325, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-flip-y]": 0.004431899986229837, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[nonsquare-60x80-transpose]": 0.005232500028796494, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-both]": 0.004553099861368537, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-x]": 0.004696300020441413, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-flip-y]": 0.004460099968127906, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_a_flip_or_transpose_would_be_rejected[square-60x60-transpose]": 0.004669500049203634, + "spyde/tests/migrated/test_ebsd_bands_kikuchipy_parity.py::TestTheTestHasTeeth::test_dropping_the_aspect_ratio_would_be_rejected": 0.005072700092568994, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_builds_from_euler_angles": 0.024588799919001758, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_carries_scores_as_a_property": 0.00480640004388988, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_phase_symmetry_comes_from_the_space_group": 0.006278199958615005, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestCrystalMap::test_step_scales_the_coordinates": 0.003483800101093948, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestEndToEnd::test_index_then_colour_recovers_the_grain_structure": 1.1448707999661565, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_is_rgb_shaped_for_the_existing_display": 0.01604600006248802, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_one_orientation_gives_one_colour": 0.01624420005828142, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_shape_and_range": 0.015559800085611641, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestIpfColors::test_the_two_grains_get_different_colours": 0.01622200000565499, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_mismatched_coverage_is_caught": 0.0011303999926894903, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_picks_the_higher_scoring_phase_per_position": 0.0017519998364150524, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestMergePhases::test_reshapes_to_the_scan": 0.0010312998201698065, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_a_boundary_shows_as_low_agreement": 0.0009192000143229961, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_detects_a_confidently_wrong_position": 0.0008362999651581049, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_partial_overlap_is_between_zero_and_one": 0.0009222999215126038, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_rejects_a_mismatched_shape": 0.0007737998384982347, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_requires_a_nav_shape": 0.0007314999820664525, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_uniform_indexing_scores_one": 0.0010583000257611275, + "spyde/tests/migrated/test_ebsd_crystal_map.py::TestOrientationSimilarityMap::test_works_on_a_real_indexing_result": 0.4900526999263093, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_every_similarity_matches": 0.0021060999715700746, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_mps_matches_the_reference_too": 0.025518300011754036, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_same_pattern_wins": 0.0014025999698787928, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_the_winning_score_matches": 0.0019030000548809767, + "spyde/tests/migrated/test_ebsd_indexing.py::TestKikuchipyParity::test_tiling_does_not_move_us_off_the_reference": 0.0014259000308811665, + "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_invariant_to_gain_and_offset": 0.0036549001233652234, + "spyde/tests/migrated/test_ebsd_indexing.py::TestNormalisation::test_survives_a_detector_background": 0.03340150020085275, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_a_finer_dictionary_matches_better": 14.616105500026606, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_background_removal_is_what_makes_scores_near_one": 0.006989100016653538, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_exact_dictionary_recovers_every_orientation": 0.07547169993631542, + "spyde/tests/migrated/test_ebsd_indexing.py::TestRecoversKnownOrientations::test_the_two_grains_index_differently": 0.005989200086332858, + "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_covers_the_cubic_fundamental_zone": 0.0008431000169366598, + "spyde/tests/migrated/test_ebsd_indexing.py::TestSampleOrientations::test_finer_step_gives_a_bigger_dictionary": 0.0009755000937730074, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_accepts_flattened_or_image_shaped_patterns": 0.0022307998733595014, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_mismatched_detector_size_is_caught": 0.010062500135973096, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_orientations_reshape_to_the_scan": 0.004212499945424497, + "spyde/tests/migrated/test_ebsd_indexing.py::TestShapesAndGuards::test_progress_reports_completion": 0.0016264000441879034, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_keep_larger_than_the_dictionary_is_clamped": 0.004514400032348931, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_scores_are_sorted_best_first": 0.005280200159177184, + "spyde/tests/migrated/test_ebsd_indexing.py::TestTiling::test_tiled_equals_untiled": 0.9699459000257775, + "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_is_differentiable_wrt_orientation": 0.003969899960793555, + "spyde/tests/migrated/test_ebsd_refine.py::TestBandSimulator::test_matches_the_numpy_generator": 0.004083500127308071, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_chunked_matches_unchunked": 0.690695199999027, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_each_pattern_gets_its_own_orientation": 0.4578904998488724, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_result_maps_back_to_the_scan": 0.039753500022925436, + "spyde/tests/migrated/test_ebsd_refine.py::TestBatching::test_shape_mismatch_is_caught": 0.002100899931974709, + "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_a_failing_callback_does_not_kill_the_refine": 0.07651210005860776, + "spyde/tests/migrated/test_ebsd_refine.py::TestCallbacks::test_yield_is_called_inside_the_step_loop": 0.1426971001783386, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_is_differentiable": 0.004432800109498203, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_matches_the_numpy_reference": 0.0017361999489367008, + "spyde/tests/migrated/test_ebsd_refine.py::TestEulerToMatrix::test_produces_proper_rotations": 0.003355899825692177, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_beats_a_coarse_dictionary": 1.328116099932231, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_never_returns_a_worse_orientation": 0.11133669991977513, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_recovers_a_perturbed_orientation": 2.432465999852866, + "spyde/tests/migrated/test_ebsd_refine.py::TestRefinementImprovesOnIndexing::test_reports_the_score_it_started_from": 0.22326670004986227, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_a_different_position_gives_different_bands": 0.573894799919799, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBandOverlay::test_draws_line_segments_and_streams_the_match": 0.5469632999738678, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_builds_a_wizard_with_a_resident_dictionary": 0.7684332000790164, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_no_background_means_no_simulated_filter": 0.5307455998845398, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_rebuilding_replaces_the_previous_wizard": 0.8472157001961023, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_static_only_does_not_filter_the_dictionary": 0.5809413999086246, + "spyde/tests/migrated/test_ebsd_wizard.py::TestBuildDictionary::test_the_dictionary_is_filtered_like_the_data": 0.54567409993615, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_eager_data_still_gets_a_bounded_chunking": 0.6124374000355601, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_is_one_lazy_graph_over_the_chunks": 0.726185500039719, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_indexing_reads_the_scan_chunk_by_chunk": 1.042217000038363, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_patterns_split_across_chunks_are_merged": 0.04950329998973757, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_adp_map_is_seamless_across_chunks": 0.4588679999578744, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_lazy_signals_own_chunking_is_left_alone": 0.04498490004334599, + "spyde/tests/migrated/test_ebsd_wizard.py::TestNeverMaterialisesTheScan::test_the_static_reference_is_streamed_too": 0.7655443999683484, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_band_count_and_zone_axes_apply_live": 0.5710748001001775, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_is_a_no_op_before_the_dictionary_exists": 0.2452608000021428, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRefineStage::test_moving_the_projection_centre_moves_the_lines": 0.6414072000188753, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_indexes_the_scan_into_an_ipf_window": 0.8292673999676481, + "spyde/tests/migrated/test_ebsd_wizard.py::TestRunStage::test_refuses_before_the_dictionary_is_built": 0.315358699997887, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_every_stage_resolves": 0.0007209000177681446, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_overlay_toggle_reaches_the_wizard": 0.5303079000441357, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_schema_is_registered_and_matches_the_defaults": 0.0007660998962819576, + "spyde/tests/migrated/test_ebsd_wizard.py::TestWiring::test_the_toolbar_entry_is_gated_on_the_ebsd_signal_type": 0.0007041000062599778, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_bound_method_raises_on_faithful_widget": 0.0021065999753773212, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_event_handler_fn_makes_bound_method_registerable": 0.001731199910864234, + "spyde/tests/migrated/test_event_handler_bound_method.py::test_wrapper_preserves_name": 0.0016229999018833041, + "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_data_dir_is_reported_even_when_nothing_is_downloaded": 0.0008863999973982573, + "spyde/tests/migrated/test_example_catalogue.py::TestBuildingItIsCheap::test_the_catalogue_never_opens_a_data_file": 0.00370410003233701, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_downloaded_reflects_the_file_on_disk": 0.004236500128172338, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_every_entry_has_what_the_menu_draws": 0.0036290999269112945, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_lists_datasets_grouped_by_technique": 0.030047900043427944, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_resolve_round_trips_a_key": 0.003612399916164577, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_base_class_is_not_a_dataset": 0.0010471000568941236, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_camera_is_carried_through": 0.003599399933591485, + "spyde/tests/migrated/test_example_catalogue.py::TestCatalogue::test_the_modalities_spyde_is_built_around_come_first": 0.0033556999405846, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_an_undownloaded_dataset_without_a_declared_shape_shows_none": 0.0008994998643174767, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_declared_shape_wins_over_reading_the_file": 0.0010489000706002116, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_record_shape_stamps_what_a_load_already_knows": 0.010148399975150824, + "spyde/tests/migrated/test_example_catalogue.py::TestShape::test_shape_of_signal_is_nav_then_signal": 0.00343000004068017, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_cancel_raises": 0.0014302998315542936, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_done_clamped_to_total": 0.0008210999658331275, + "spyde/tests/migrated/test_example_download.py::TestIpcProgress::test_pooch_protocol_sequence": 0.004516499931924045, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_cancel_flow": 0.0008570000063627958, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_done_emitted_only_when_started": 0.0008211999665945768, + "spyde/tests/migrated/test_example_download.py::TestPatchedDownloader::test_the_monitor_is_a_pooch_progressbar": 0.0008307000389322639, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_handles_frame_edges": 0.0011823999229818583, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_disk_mean_more_stable_than_point_sample": 0.049843099899590015, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_find_vectors_stores_disk_mean_intensity": 0.005130000063218176, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_gpu_pack_ghost_to_core_frame_index": 0.0015455001266673207, + "spyde/tests/migrated/test_find_vectors.py::TestPeakIntensityRobust::test_radius_below_one_falls_back_to_point": 0.0014685001224279404, + "spyde/tests/migrated/test_find_vectors.py::test_at_correct_row_count": 0.0009176000021398067, + "spyde/tests/migrated/test_find_vectors.py::test_auto_params_valid_ranges": 0.03700109990313649, + "spyde/tests/migrated/test_find_vectors.py::test_count_map_shape_and_values": 0.0008781999349594116, + "spyde/tests/migrated/test_find_vectors.py::test_detects_known_peaks": 0.0042065001325681806, + "spyde/tests/migrated/test_find_vectors.py::test_disk_kernel_cached": 0.00079109997022897, + "spyde/tests/migrated/test_find_vectors.py::test_flatten_full_buffer": 0.0008489000611007214, + "spyde/tests/migrated/test_find_vectors.py::test_from_ragged_roundtrip": 0.0010209999745711684, + "spyde/tests/migrated/test_find_vectors.py::test_kxy_at_correct_columns": 0.0008690999820828438, + "spyde/tests/migrated/test_find_vectors.py::test_map_blocks_wrong_at_chunk_boundary": 0.009057000046595931, + "spyde/tests/migrated/test_find_vectors.py::test_map_overlap_correct_at_chunk_boundary": 0.0347727999323979, + "spyde/tests/migrated/test_find_vectors.py::test_min_distance_prevents_duplicates": 0.0061923000030219555, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_cold_fallback": 0.01571219996549189, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_edge_accuracy": 0.02468950010370463, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_invalidate_clears": 0.0008189000654965639, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_stale_guard": 0.006715199910104275, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_hit": 0.007426500087603927, + "spyde/tests/migrated/test_find_vectors.py::test_nav_blur_cache_warm_speed": 1.412295899935998, + "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_larger_than_depth": 0.0007346998900175095, + "spyde/tests/migrated/test_find_vectors.py::test_nav_chunk_size_within_memory_limit": 0.0008624999318271875, + "spyde/tests/migrated/test_find_vectors.py::test_output_shapes": 0.0016930000856518745, + "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_4d": 0.004385199979878962, + "spyde/tests/migrated/test_find_vectors.py::test_sigma_tuple_5d": 0.005203299922868609, + "spyde/tests/migrated/test_find_vectors.py::test_single_frame_pipeline_under_20ms": 0.09367860003840178, + "spyde/tests/migrated/test_find_vectors.py::test_spots_at_returns_list": 0.0008685999782755971, + "spyde/tests/migrated/test_find_vectors.py::test_subpixel_refinement_produces_fractional_coords": 0.00342369987629354, + "spyde/tests/migrated/test_find_vectors.py::test_threshold_controls_count": 0.005672300001606345, + "spyde/tests/migrated/test_find_vectors.py::test_to_dense_shape_and_cache": 0.0009233999298885465, + "spyde/tests/migrated/test_find_vectors.py::test_to_pyxem_type": 0.00317680009175092, + "spyde/tests/migrated/test_find_vectors.py::test_zero_frame_no_peaks": 0.0014603000599890947, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_auto_from_signal_samples_sparsely": 0.018918799934908748, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_lollipop": 0.002459099981933832, + "spyde/tests/migrated/test_find_vectors_dog.py::TestBeamstopDetection::test_detect_beamstop_none_when_featureless": 0.001961400150321424, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_dog_route": 0.0067365000722929835, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDispatcher::test_nxcorr_route_still_works": 0.009773400030098855, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_beamstop_auto_memory_safe": 0.11439949995838106, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_lazy_batch_memory_safe": 0.10151369997765869, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGBatch::test_numpy_batch": 0.09179310011677444, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_beamstop_excludes_and_no_rim_peak": 0.005309099913574755, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_finds_all_spots": 0.003033999935723841, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_intensity_column_is_raw": 0.003320600022561848, + "spyde/tests/migrated/test_find_vectors_dog.py::TestDoGSingleFrame::test_subpixel_shifts_off_integer": 0.004625100060366094, + "spyde/tests/migrated/test_find_vectors_memory.py::test_5d_nav_shape": 0.11378380004316568, + "spyde/tests/migrated/test_find_vectors_memory.py::test_all_positions_present_in_offsets": 0.05688729998655617, + "spyde/tests/migrated/test_find_vectors_memory.py::test_at_returns_correct_slice_lengths": 0.028842900064773858, + "spyde/tests/migrated/test_find_vectors_memory.py::test_at_row_columns_match_full_flat_buffer": 0.03685889998450875, + "spyde/tests/migrated/test_find_vectors_memory.py::test_chunk_boundary_result_equals_single_chunk": 0.09115909994579852, + "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_dtype_is_int32": 0.04500889987684786, + "spyde/tests/migrated/test_find_vectors_memory.py::test_count_map_sums_to_flat_buffer_len": 0.04534890002105385, + "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_never_computes_full_array": 1.9634410999715328, + "spyde/tests/migrated/test_find_vectors_memory.py::test_dask_path_produces_correct_nav_shape": 0.18885959987528622, + "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_columns_in_calibrated_range": 0.0627063998254016, + "spyde/tests/migrated/test_find_vectors_memory.py::test_flat_buffer_dtype_is_float32": 0.031815099879167974, + "spyde/tests/migrated/test_find_vectors_memory.py::test_high_threshold_gives_fewer_vectors": 0.07120239990763366, + "spyde/tests/migrated/test_find_vectors_memory.py::test_intensity_column_is_raw_frame_intensity": 0.042282599955797195, + "spyde/tests/migrated/test_find_vectors_memory.py::test_large_nav_does_not_compute_full_array": 1.5981369998771697, + "spyde/tests/migrated/test_find_vectors_memory.py::test_live_count_chunk_writes_global_location": 0.029738800134509802, + "spyde/tests/migrated/test_find_vectors_memory.py::test_nav_coords_in_range": 0.06230439990758896, + "spyde/tests/migrated/test_find_vectors_memory.py::test_no_full_compute_via_tracemalloc": 1.2460684002144262, + "spyde/tests/migrated/test_find_vectors_memory.py::test_non_square_nav": 0.03552320005837828, + "spyde/tests/migrated/test_find_vectors_memory.py::test_numpy_path_allowed_to_hold_full_array": 0.04834879992995411, + "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_dtype_is_int64": 0.03955299989320338, + "spyde/tests/migrated/test_find_vectors_memory.py::test_offsets_monotonically_non_decreasing": 0.03394180000759661, + "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_called_covering_full_nav": 0.07611770008224994, + "spyde/tests/migrated/test_find_vectors_memory.py::test_on_chunk_done_count_subarray_matches_final": 0.0817451000912115, + "spyde/tests/migrated/test_find_vectors_memory.py::test_reproducible_with_same_params": 0.15835949999745935, + "spyde/tests/migrated/test_find_vectors_memory.py::test_result_offsets_never_exceed_buffer_length": 0.07872180012054741, + "spyde/tests/migrated/test_find_vectors_memory.py::test_single_nav_position": 0.018864600104279816, + "spyde/tests/migrated/test_find_vectors_memory.py::test_stopped_flag_returns_none": 0.00866289995610714, + "spyde/tests/migrated/test_find_vectors_memory.py::test_zero_signal_produces_no_vectors": 0.07186680007725954, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_chunk_passes_persistence": 0.0008275000145658851, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_carries_bg_sigma": 0.0008730000117793679, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_coerce_neural_no_nav_blur_and_spot_radius": 0.0009564000647515059, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_dask_spawn_method_pinned": 0.0048137998674064875, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_default_device_chain": 0.0008223999757319689, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_detect_batch_runtimeerror_cpu_retry": 0.00387150002643466, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_emit_calibration_wiring": 0.006616900092922151, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_fv_refresh_models_emits": 0.001146299997344613, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_conc_one_on_mac_serializes": 0.0008665000787004828, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_gpu_policy_modes": 0.0011075999354943633, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_lane_split_default_mode": 0.0011137000983580947, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_allowed_platform_gate": 0.0009468999924138188, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_cpu_escape_hatch_on_mac": 0.0009855999378487468, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_batch_uses_mps_by_default_on_mac": 0.0009333998896181583, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_fallback_env_set_on_darwin": 0.003402199945412576, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_enabled_gate": 0.0009802000131458044, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_mps_neural_lane_pins_single_worker": 0.0010432000271975994, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_block_respects_gpu_off": 0.0009388000471517444, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_default_and_models_payload": 0.0029703000327572227, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_gpu_demote_flag": 0.00122260011266917, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_neural_run_cpu": 1.484783299965784, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_preview_dispatch_passes_bg_sigma": 0.0010905000381171703, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_spot_size_drives_model_scale": 0.0011240000603720546, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_death_detected": 0.000979500007815659, + "spyde/tests/migrated/test_find_vectors_neural.py::TestFindVectorsNeural::test_worker_plugin_sets_mac_env": 0.0009643000084906816, + "spyde/tests/migrated/test_find_vectors_no_numba.py::TestFindVectorsNoNumba::test_package_imports_without_numba": 6.220705299987458, + "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_find_vectors_creates_attached_vectors_tree": 0.8665511000435799, + "spyde/tests/migrated/test_find_vectors_port.py::TestFindVectorsPort::test_rejects_non_4d_dataset": 0.3072044001892209, + "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_no_stripe_at_the_boundary_columns": 0.35794280003756285, + "spyde/tests/migrated/test_find_vectors_refine_seam.py::TestRefineIsChunkInvariant::test_the_count_map_does_not_change_with_the_nav_chunking": 1.0998248001560569, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_intensity_tracks_raw_disk_amplitude": 0.005068999947980046, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_beats_integer": 0.007265400025062263, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelAccuracy::test_subpixel_is_applied_and_subpixel": 0.007274999865330756, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_integer_peak_matches_skimage": 0.008248600061051548, + "spyde/tests/migrated/test_find_vectors_subpixel.py::TestSubpixelUnbiased::test_subpixel_unbiased_on_gaussian": 0.008789800107479095, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_finds_all_disks_batched": 0.03504260000772774, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_quadratic_fit_recovers_subpixel_centers": 0.03641550010070205, + "spyde/tests/migrated/test_find_vectors_torch.py::TestFindVectorsTorch::test_subpixel_off_returns_integer_peaks": 0.00488449982367456, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_preview_tune_run": 1.2554834999609739, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestFindVectorsWizard::test_stop_removes_preview": 0.5631297999061644, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_mask_overlay_pushed_to_plot": 0.001661999966017902, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_nxcorr_transform_clim_ceiling_is_fixed": 0.001884999917820096, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_set_params_beamstop_auto_toggles_mask": 0.02670449996367097, + "spyde/tests/migrated/test_find_vectors_wizard.py::TestPreviewBeamstopToggle::test_show_transform_compute_and_render": 0.0064781998516991735, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_dispatch_mark_tutorial_seen_routes": 0.007480200030840933, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_first_run_true_by_default": 0.00850259989965707, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_idempotent": 0.008121300023049116, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_mark_tutorial_seen_persists": 0.024816099903546274, + "spyde/tests/migrated/test_first_run.py::TestFirstRunFlag::test_restores_persisted_flag_on_restart": 0.01935720001347363, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_false_after_marking": 0.0076157000148668885, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_emits_first_run_result_true": 0.007205799920484424, + "spyde/tests/migrated/test_first_run.py::TestGetFirstRunAction::test_staged_handler_registered": 0.0007044998928904533, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_transposed_position_is_a_different_position": 0.05855210009030998, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_a_wrong_width_vector_is_refused": 0.05308849993161857, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_an_out_of_range_position_is_refused": 0.051547500072047114, + "spyde/tests/migrated/test_fit_store.py::TestIndexing::test_the_key_matches_how_the_display_reads_the_data": 0.06004679994657636, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_an_unfitted_position_reads_nothing": 0.053179900045506656, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_clear_forgets_everything": 0.05144710000604391, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_coverage_counts_positions": 0.05077790003269911, + "spyde/tests/migrated/test_fit_store.py::TestIsSet::test_fitted_to_zero_is_not_the_same_as_unfitted": 0.05452559993136674, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_a_spec_hyperspy_cannot_build_still_gets_a_store": 0.010024799965322018, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_it_is_a_real_hyperspy_model": 0.06444700004067272, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_parameter_order_is_the_engines_column_order": 0.057558099972084165, + "spyde/tests/migrated/test_fit_store.py::TestItIsHyperspysStore::test_the_values_reach_the_parameter_maps_on_save": 0.08991880004759878, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_a_fitted_position_becomes_finite": 0.05660349992103875, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_every_map_starts_empty": 0.05042810004670173, + "spyde/tests/migrated/test_fit_store.py::TestMaps::test_the_area_map_tracks_the_amplitude": 0.060172000085003674, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_a_stored_model_survives_a_save_and_reload": 0.2752697999821976, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_an_unfitted_position_stays_unfitted_across_the_round_trip": 0.26986709993798286, + "spyde/tests/migrated/test_fit_store.py::TestSaveAndLoad::test_the_names_are_listed": 0.07355540001299232, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_a_wrong_width_scan_is_refused": 0.05549599998630583, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_fills_every_position": 0.05954909999854863, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_put_all_lands_where_the_display_looks": 0.06257300020661205, + "spyde/tests/migrated/test_fit_store.py::TestWholeScan::test_values_array_round_trips": 0.06738499994389713, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_poor_position_is_remembered_and_flagged": 0.12995940004475415, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_records_every_converged_position": 0.1094483999768272, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_a_run_reports_its_coverage": 0.12251750007271767, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_navigating_after_a_run_recalls_instead_of_refitting": 0.12113889993634075, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_refitting_a_position_clears_its_poor_flag": 0.14490189997013658, + "spyde/tests/migrated/test_fit_wizard.py::TestARunFillsTheStore::test_the_store_is_indexed_like_the_display": 0.10691700002644211, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_off_leaves_the_model_alone": 0.10610190010629594, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_adaptive_on_fits_an_unvisited_position": 1.0219829000998288, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_every_navigation_path_answers": 0.11343709996435791, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_recalls_before_it_refits": 0.10100150003563613, + "spyde/tests/migrated/test_fit_wizard.py::TestAdaptiveFit::test_navigating_with_no_model_does_nothing": 0.06956940004602075, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_background_gets_widgets_on_the_plot": 0.12138990010134876, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_a_nonsense_drag_leaves_the_model_alone": 0.11107909993734211, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_anchors_follow_a_parameter_edit": 0.11190950009040534, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Exponential]": 0.13703550002537668, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Offset]": 0.11089280003216118, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[Polynomial]": 0.11166100006084889, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_dragging_an_anchor_puts_the_curve_under_it[PowerLaw]": 0.11096959991846234, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[Exponential]": 0.11004979978315532, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundAnchors::test_the_anchor_you_are_not_holding_stays_put[PowerLaw]": 0.1193436001194641, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_background_is_not_seeded_onto_a_peak": 0.0010719000129029155, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_peak_is_not_treated_as_a_background": 0.0008153999224305153, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_power_law_keeps_hyperspys_origin_when_it_can": 0.0011788998963311315, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Exponential]": 0.0014775001909583807, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Offset]": 0.001280799973756075, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[Polynomial]": 0.0015468000201508403, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_a_seeded_background_is_the_same_size_as_the_data[PowerLaw]": 0.0017370999557897449, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_adding_a_background_puts_its_handles_on_the_curve": 0.11910609994083643, + "spyde/tests/migrated/test_fit_wizard.py::TestBackgroundSeeding::test_flat_data_cannot_fix_an_exponential": 0.0010321999434381723, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_a_bad_edit_does_not_kill_the_wizard": 0.12745709996670485, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_add_component_appears_in_the_state": 0.1580971999792382, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_components_are_seeded_onto_the_current_axis": 0.136619400116615, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_remove_component": 0.15744439989794046, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_can_fix_a_parameter": 0.15595020004548132, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_set_param_updates_the_model": 0.1449600999476388, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_two_of_a_kind_get_distinct_names": 0.26243870006874204, + "spyde/tests/migrated/test_fit_wizard.py::TestBuildingTheModel::test_unknown_component_is_reported_not_added": 0.07099419983569533, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_every_offered_component_previews": 0.004960100166499615, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_peak_shapes_are_actually_peaks": 0.001084199990145862, + "spyde/tests/migrated/test_fit_wizard.py::TestCatalogue::test_previews_are_normalised_and_finite": 0.001157199963927269, + "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_makes_one_tree_with_a_view_per_component": 0.27621550008188933, + "spyde/tests/migrated/test_fit_wizard.py::TestCommit::test_commit_without_a_fit_is_refused": 0.16455439990386367, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_area_tracks_the_amplitude": 0.24086020002141595, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentAreaMaps::test_one_map_per_component_shaped_to_the_scan": 0.13628350000362843, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_a_dead_component_reads_as_dead": 0.25024809991009533, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_share_is_relative_peak_height": 0.25881419994402677, + "spyde/tests/migrated/test_fit_wizard.py::TestComponentContribution::test_the_state_carries_it": 0.1394807001342997, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_drag_event_carries_the_widget_on_event_source": 0.13171200011856854, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_gaussians_amplitude_is_an_area_not_a_height": 0.000728099956177175, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_height_parameterised_component_is_left_alone": 0.0006537000881507993, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_a_reentrant_drag_is_guarded": 0.128383900038898, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_an_unknown_component_is_ignored": 0.12629010004457086, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_dragging_invalidates_a_previous_fit": 0.13439879997167736, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_drag_target_names_real_parameters": 0.08240399998612702, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_every_offered_component_has_handles": 0.0006122998893260956, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_height_and_amplitude_round_trip": 0.0007599999662488699, + "spyde/tests/migrated/test_fit_wizard.py::TestDragHandles::test_width_drag_keeps_the_peak_height": 0.13022290007211268, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_does_not_emit_state": 0.1437150000128895, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_a_live_move_still_updates_the_model": 0.1323000000556931, + "spyde/tests/migrated/test_fit_wizard.py::TestDragSmoothness::test_the_release_emits_state": 0.13082960003521293, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_does_not_produce_a_scan_result": 0.12680379999801517, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_fits_only_the_displayed_spectrum": 0.270578800002113, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_refuses_with_no_components": 0.09753859997726977, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_reports_whether_it_converged": 0.1190360999898985, + "spyde/tests/migrated/test_fit_wizard.py::TestFitCurrentSpectrum::test_writes_the_result_back_into_the_model": 0.1303618000820279, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_does_not_silently_use_the_navigation_mean": 0.06559759995434433, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_fit_current_matches_the_displayed_pixel": 0.21924390003550798, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_ignores_a_stale_shape": 0.0662559000775218, + "spyde/tests/migrated/test_fit_wizard.py::TestFitsWhatIsOnScreen::test_uses_the_painted_spectrum": 0.06919179996475577, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_live_drag_still_does_not_re_send_the_model": 0.12516559998039156, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_a_real_drag_still_discards_it": 0.13239620008971542, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_moving_the_handles_does_not_discard_the_fit": 0.13808169995900244, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_handle_being_dragged_is_not_written_back": 0.13572270004078746, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_point_tracks_a_live_width_drag": 0.1308522999752313, + "spyde/tests/migrated/test_fit_wizard.py::TestHandlesStayOnTheComponent::test_the_range_band_tracks_a_live_point_drag": 0.14579009998124093, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_tears_the_wizard_down": 0.07015840010717511, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_close_without_open_does_not_raise": 0.06196980003733188, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_double_fire_leaves_exactly_one_controller": 0.09214879991486669, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_creates_a_wizard_and_sends_state": 0.3334605998825282, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_open_sends_the_component_palette": 0.23414190008770674, + "spyde/tests/migrated/test_fit_wizard.py::TestOpenClose::test_reopen_without_close_is_idempotent": 0.0800715999212116, + "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_a_parameter_edit_does_not_rebuild_the_handles": 0.15353370003867894, + "spyde/tests/migrated/test_fit_wizard.py::TestParameterEditsMoveTheHandles::test_editing_a_parameter_moves_its_handle": 0.12739729997701943, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_real_session_exposes_a_position": 0.07504959998186678, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_a_wrong_length_vector_is_refused": 0.10336170007940382, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_an_unvisited_position_recalls_nothing": 0.10719069989863783, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_changing_the_model_clears_the_store": 0.18808710004668683, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_no_selector_means_no_position": 0.07452160003595054, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_reads_the_position_from_the_selector": 0.08722299989312887, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_remembers_and_recalls_per_position": 0.10657609987538308, + "spyde/tests/migrated/test_fit_wizard.py::TestPerPositionMemory::test_the_store_survives_close_and_reopen": 0.14459219994023442, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_reopening_reports_the_restored_model": 0.16838020004797727, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_fit_survives_close_and_reopen": 0.15958669991232455, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_lives_on_the_tree_not_the_controller": 0.1588375000283122, + "spyde/tests/migrated/test_fit_wizard.py::TestPersistence::test_the_model_survives_close_and_reopen": 0.1788152998778969, + "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_fits_every_position": 0.2596373000415042, + "spyde/tests/migrated/test_fit_wizard.py::TestRun::test_run_without_components_is_refused": 0.06579299992881715, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_a_polynomial_keeps_its_order": 0.019529600045643747, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_each_caller_gets_its_own_spec": 0.0008731998968869448, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_background_wizard_shares_the_cache": 0.19746799988206476, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_catalogue_is_cached_per_axis": 0.004297700012102723, + "spyde/tests/migrated/test_fit_wizard.py::TestSpecsAreBuiltOnce::test_the_prototype_is_shared": 0.0007079999195411801, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_a_fitted_position_fills_one_pixel": 0.13005689985584468, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_closing_the_caret_closes_the_maps_window": 0.13489290012512356, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_committed_tree_is_NOT_closed_with_the_caret": 0.8906383001012728, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_exist_before_anything_is_fitted": 0.15811800002120435, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_maps_include_chi_squared": 0.1273339999606833, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_the_store_survives_the_caret": 0.1330743000144139, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_ONE_maps_window_refreshed_in_place": 0.15345869993325323, + "spyde/tests/migrated/test_fit_wizard.py::TestTheResultMaps::test_there_is_one_map_per_component": 0.2576124999905005, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_every_staged_handler_is_registered": 0.0009035001276060939, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_fit_is_offered_on_1d_plots_only": 0.0009455999825149775, + "spyde/tests/migrated/test_fit_wizard.py::TestToolbarGating::test_the_parameter_schema_resolves": 0.0009042999008670449, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_background_is_not_bounded_to_the_axis": 0.0016034001018851995, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_co_centred_pair_is_still_recovered": 0.16329679999034852, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_a_peak_cannot_wander_off_the_data": 0.0009941000025719404, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_separated_peaks_are_actually_recovered": 0.06867939990479499, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_the_pair_still_straddles_the_seed": 0.23429409984964877, + "spyde/tests/migrated/test_fit_wizard.py::TestTwoOfAKindCanBeFitted::test_two_of_a_kind_do_not_share_a_centre": 0.2446023999946192, + "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_each_row_gets_its_own_surface": 0.0013151000021025538, + "spyde/tests/migrated/test_fitting_2d.py::TestBatching::test_non_square_images_are_not_transposed": 0.0011751999845728278, + "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_matches_a_ravelled_mgrid": 0.001261299941688776, + "spyde/tests/migrated/test_fitting_2d.py::TestCoordinates::test_shape_and_ordering": 0.0009439999703317881, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_a_fixed_parameter_stays_fixed_in_2d": 0.0994090000167489, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_bounds_apply_in_2d_too": 0.2090584000106901, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_fits_many_images_at_once": 0.2876757001504302, + "spyde/tests/migrated/test_fitting_2d.py::TestFittingAnImage::test_recovers_the_generating_parameters": 0.08841019996907562, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_analytic_gradient_matches_autodiff": 0.22850209998432547, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_linear_flag_matches_hyperspy": 0.08261750009842217, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_parameter_order_matches_hyperspy": 0.27791860001161695, + "spyde/tests/migrated/test_fitting_2d.py::TestGaussian2DParity::test_values_match_hyperspy": 0.07155900017824024, + "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_gaussian2d_round_trips_through_modelspec": 0.16370769997593015, + "spyde/tests/migrated/test_fitting_2d.py::TestRoundTrip::test_the_engine_reports_2d_support": 0.0007321999873965979, + "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_chunked_and_unchunked_agree": 0.26518809993285686, + "spyde/tests/migrated/test_fitting_engine.py::TestChunking::test_result_shape_follows_the_navigation_grid": 0.08786540012806654, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_cpu_is_always_usable": 0.07713499991223216, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_default_device_is_reported": 0.0007139000808820128, + "spyde/tests/migrated/test_fitting_engine.py::TestDevice::test_env_var_forces_the_device": 0.0008399999933317304, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_all_parameters_fixed_is_a_clear_error": 0.04490999993868172, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_bounds_are_respected": 0.11167210002895445, + "spyde/tests/migrated/test_fitting_engine.py::TestFixedParametersAndBounds::test_fixed_parameter_is_not_moved": 0.057183199794963, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_clean_data_converges_in_float32": 0.08527689997572452, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_matches_multifit": 0.2908157999627292, + "spyde/tests/migrated/test_fitting_engine.py::TestFloat32Convergence::test_float32_stops_early_instead_of_burning_the_budget": 0.09028420003596693, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_a_failing_progress_callback_does_not_kill_the_fit": 0.07552759989630431, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_axis_length_mismatch_is_caught": 0.03952480002772063, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_progress_callback_reports_completion": 0.13527710002381355, + "spyde/tests/migrated/test_fitting_engine.py::TestGuards::test_unsupported_component_refuses_rather_than_dropping_it": 0.005368699901737273, + "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_per_position_seeds_are_used": 0.05568859993945807, + "spyde/tests/migrated/test_fitting_engine.py::TestInitialValues::test_seeds_outside_bounds_are_clipped_not_rejected": 0.19515259994659573, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_float64_request_is_downcast_not_an_error": 0.000408099964261055, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_agrees_with_cpu_float32": 0.0004369000671431422, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_converges": 0.00041660002898424864, + "spyde/tests/migrated/test_fitting_engine.py::TestMPSParity::test_mps_matches_multifit": 0.00041960005182772875, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_every_position_converges_on_clean_data": 0.08495910000056028, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_parameters_match_hyperspy_multifit": 0.18628260004334152, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_power_law_background_matches_multifit": 0.12776030006352812, + "spyde/tests/migrated/test_fitting_engine.py::TestParityWithMultifit::test_recovers_the_truth_it_was_built_from": 0.09005690005142242, + "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_mask_length_mismatch_is_caught": 0.03734939999412745, + "spyde/tests/migrated/test_fitting_engine.py::TestSignalRange::test_masked_channels_do_not_influence_the_fit": 0.15469240001402795, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_a_coarser_request_is_honoured": 0.0007433999562636018, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float32_tolerances_are_raised_above_epsilon": 0.00074970000423491, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_float64_tolerances_are_left_alone": 0.000772800063714385, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_mps_downcasts_float64": 0.0007156999781727791, + "spyde/tests/migrated/test_fitting_engine.py::TestToleranceFloor::test_other_devices_keep_the_dtype": 0.000656199874356389, + "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_poisson_weighting_runs_and_stays_sane": 0.08846270001959056, + "spyde/tests/migrated/test_fitting_engine.py::TestWeights::test_unknown_weighting_is_rejected": 0.034650899935513735, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_a_coarse_sample_seeds_itself": 0.0009338000090792775, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_always_includes_the_last_index": 0.0009042999008670449, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_each_position_maps_to_its_nearest_coarse_sample": 0.000811200006864965, + "spyde/tests/migrated/test_fitting_seeding.py::TestCoarseIndices::test_samples_the_strided_grid": 0.0010213999776169658, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_coarse_pass_gets_a_larger_iteration_budget": 0.13346300006378442, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_converged_coarse_fits_are_propagated": 0.10822000016923994, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_failed_coarse_fits_are_not_propagated": 0.15624620008748025, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_matches_a_cold_fit_on_easy_data": 0.21074879996012896, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_oversized_stride_falls_back_instead_of_wasting_a_pass": 0.0922589001711458, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_plain_fit_reports_no_seeding": 0.1201620000647381, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_recovers_the_truth": 0.15027330012526363, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_reports_how_many_seeds_were_usable": 0.1358104000100866, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeededFit::test_stride_one_degenerates_to_a_plain_fit": 0.09628999989945441, + "spyde/tests/migrated/test_fitting_seeding.py::TestSeedingHelpsWhereColdStartsStruggle::test_improves_convergence_on_a_hard_starting_point": 0.33751399989705533, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_detail_region_upsample": 0.13658080017194152, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_geometry_matches_source": 0.01380700001027435, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_is_tile_backend": 0.00823050003964454, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_mean_matches_numpy": 0.21951549989171326, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_set_array_swaps_source": 0.021648299996741116, + "spyde/tests/migrated/test_gpu_tile_backend.py::TestProtocolAndFallback::test_subsample_matches_numpy": 0.06305049988441169, + "spyde/tests/migrated/test_gpu_tile_backend.py::test_gpu_mean_correct_in_subprocess": 4.936598099884577, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_keeps_the_threshold_marker": 0.21431730000767857, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_moves_the_handles_not_the_bins": 0.23614600009750575, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_reset_spans_the_full_range": 0.20545400003902614, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_restores_robust_levels_after_a_manual_drag": 0.2525354999816045, + "spyde/tests/migrated/test_histogram_contrast.py::TestAutoClim::test_unknown_window_is_a_no_op": 0.22715699998661876, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_bulk_is_resolved_across_many_bins": 0.003270599991083145, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_clipping_never_drops_samples": 0.0028742001159116626, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_flat_frame_falls_back_to_full_extent": 0.0006847999757155776, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_tail_does_not_own_the_axis": 0.002800100133754313, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_the_handles_land_inside_the_drawn_range": 0.0028223999543115497, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistRange::test_uniform_data_is_not_clipped": 0.001577999908477068, + "spyde/tests/migrated/test_histogram_contrast.py::TestHistogramMessage::test_carries_the_full_extent": 0.20005540002603084, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_hex_net": 0.002289599855430424, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_noisy_net_still_fits": 0.0022403999464586377, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_random_points_reject": 0.0013420999748632312, + "spyde/tests/migrated/test_index_and_calibrate.py::TestBasisFit::test_square_net": 0.009710000013001263, + "spyde/tests/migrated/test_index_and_calibrate.py::TestCentering::test_friedel_center_recovered": 0.1524877999909222, + "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_manual_calibration_from_dspacing": 0.1967303000856191, + "spyde/tests/migrated/test_index_and_calibrate.py::TestEndToEnd::test_pipeline_runs_and_flags_consistency": 0.24135350005235523, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_anatase_first_reflection": 0.001733599929139018, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_cubic_d_spacing": 0.001736000063829124, + "spyde/tests/migrated/test_index_and_calibrate.py::TestPhaseDSpacings::test_d_list_descending_unique": 0.0027636002050712705, + "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_exact_recovery": 0.004766200087033212, + "spyde/tests/migrated/test_index_and_calibrate.py::TestRatioMatch::test_match_phase_ranks_correct": 0.012154600000940263, + "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_eager_round_trip": 0.004605999914929271, + "spyde/tests/migrated/test_insitu_signal_type.py::TestInSituSignalType::test_lazy_round_trip": 0.0068566001718863845, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_4d_stem_navigator_excludes_playback_buttons": 0.23314240004401654, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_movie_navigator_includes_playback_buttons": 0.26965360017493367, + "spyde/tests/migrated/test_insitu_signal_type.py::TestPlaybackToolbarGating::test_plain_1d_nav_signal_excludes_playback_buttons": 0.21406290004961193, + "spyde/tests/migrated/test_insitu_signal_type.py::TestTestHarnessMovieLoaderTypesInSitu::test_movie_root_is_insitu": 0.21929839986842126, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_continuous_pokes_are_capped_by_max_wait": 0.305387300089933, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_fill_resumes_after_scrub_settles": 0.15283560007810593, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_stop_aborts_the_wait_immediately": 0.001606200123205781, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_blocks_after_a_poke": 0.2047156998887658, + "spyde/tests/migrated/test_interactive_preempt.py::TestInteractiveActivity::test_wait_returns_fast_when_idle": 0.0016732000513002276, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_blank_and_non_json_lines_skipped": 0.004772599902935326, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_text_stdin_without_buffer_still_works": 0.00442539993673563, + "spyde/tests/migrated/test_ipc_read.py::TestReadMessages::test_utf8_non_ascii_labels_decode_intact": 0.005741000059060752, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_attach_ipf_key_registers_one_key_on_the_plot": 0.07721250003669411, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_forces_gpu": 0.032227099989540875, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_build_3d_figure_html": 0.028305599931627512, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_edge_labels_align_inwards_so_they_do_not_clip": 0.06536849995609373, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_emit_3d_figure_message": 0.03189470001962036, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_ipf_key_overlay_is_an_rgba_image": 0.07323729991912842, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_key_labels_are_fractions_of_the_image": 0.05947590013965964, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_no_ipf_key_figure_is_emitted_any_more": 0.16934939986094832, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_not_capped_at_20000": 0.19794690003618598, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_on_unit_sphere": 0.03347090003080666, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_sphere_points_still_caps_at_absurd_size": 0.20303430000785738, + "spyde/tests/migrated/test_ipf_3d.py::TestIpf3D::test_the_key_is_hover_only_by_default": 0.10257510002702475, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_attach_ipf_3d_also_emits_density": 0.21568949986249208, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_build_density_figure_has_mesh": 0.189647400053218, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_raster_known_region_maps_to_sane_color": 0.15216719987802207, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_density_uses_raster_not_polygon_mesh": 0.16416810010559857, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_emit_density_message": 0.18300829990766943, + "spyde/tests/migrated/test_ipf_density.py::TestIpfDensity::test_multiphase_builds_one_axis_per_phase": 0.37279070005752146, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_phase_ipf_geometry": 4.817342100082897, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_build_uses_single_raster_not_polygons": 0.1366304000839591, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_lut_alpha_and_orientation": 0.001159299979917705, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_corr_rgba_matches_polygon_cell_position": 0.0906130998628214, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_match_correlations_full_length": 9.24293580010999, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_no_circles_returns_none": 0.07212170015554875, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_rot_mask_from_circles_restricts": 0.11407680006232113, + "spyde/tests/migrated/test_ipf_refine.py::TestIpfRefine::test_update_panels_pushes_image_not_facecolors": 0.16874089988414198, + "spyde/tests/migrated/test_ipf_refine.py::TestRefineController::test_controller_recompute_and_double_click_toggle": 0.19658760004676878, + "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_bare_window_direction_reaches_the_controller": 1.9394685999723151, + "spyde/tests/migrated/test_ipf_two_window.py::TestDirectionDispatch::test_map_window_direction_forwards_to_the_explorer": 1.1634865999221802, + "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_aims_the_camera_down_the_vector": 0.0015165999066084623, + "spyde/tests/migrated/test_ipf_two_window.py::TestFaceCamera::test_returns_degrees_in_range": 0.0009500000160187483, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_close_is_idempotent_and_clears_the_tree": 0.629595399950631, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_opens_a_separate_window_with_all_four_views": 0.5935042999917641, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_reopening_reuses_the_same_window": 1.160160499974154, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_set_direction_recolours_every_view": 1.2645881000207737, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_does_not_re_emit_figures": 0.5911744999466464, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_marks_and_rotates": 1.3109344999538735, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_show_orientation_moves_the_2d_marker": 0.6286541000008583, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfExplorerWindow::test_window_is_titled": 0.5781854001106694, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_figure_builds": 0.11078420002013445, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_is_a_surface_not_a_point_list": 0.05637360003311187, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_density_3d_grid_lies_on_the_unit_sphere": 0.05747000011615455, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_every_vertex_is_finite": 0.08206789998803288, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_painted_cells_are_coloured_by_density": 0.07322369993198663, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_figure_has_a_marker_per_phase": 0.0806315999943763, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_points_2d_subsamples_a_huge_map": 0.19270280003547668, + "spyde/tests/migrated/test_ipf_two_window.py::TestIpfFigureBuilders::test_the_sector_is_masked_in_alpha": 0.08182740001939237, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_attach_projections_registers_three_chips": 0.17933559999801219, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_projection_maps_actually_differ": 0.05366479989606887, + "spyde/tests/migrated/test_ipf_two_window.py::TestMapWindowProjections::test_register_views_append_merges": 0.000896599842235446, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_attach_without_a_session_keeps_the_legacy_layout": 0.209977499791421, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_ebsd_finalize_builds_the_two_windows_and_keeps_its_chips": 0.7763753001345322, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.ebsd_action]": 0.0020017001079395413, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.orientation_action]": 0.001867300015874207, + "spyde/tests/migrated/test_ipf_two_window.py::TestSharedPlumbing::test_every_producer_passes_the_session[spyde.actions.vector_orientation_om]": 0.0027672001160681248, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_lazy_signal_flows_through_add_signal_without_client": 0.07814409991260618, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_opens_the_file_lazily": 0.022686799871735275, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_takes_the_first_of_a_multi_signal_file": 0.023484099889174104, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_load_example_wraps_an_eager_reader": 0.017348299967125058, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_converts_eager_signal": 0.017513400176540017, + "spyde/tests/migrated/test_lazy_loading.py::TestLazyExampleLoading::test_to_lazy_passthrough_when_already_lazy": 0.017272100085392594, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_add_signal_returns_without_blocking_on_nav_compute": 0.06305009999778122, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_client_property_reads_live_from_dask_manager": 0.09008679981343448, + "spyde/tests/migrated/test_lazy_loading.py::TestNonBlockingNavigator::test_navigator_fills_in_background_without_client": 1.462884199921973, + "spyde/tests/migrated/test_lifecycle.py::TestGenerationGuard::test_bump_and_is_current": 0.0007817000150680542, + "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_none_shm_is_noop": 0.000803499948233366, + "spyde/tests/migrated/test_lifecycle.py::TestLiveFillPoller::test_polls_until_stopped": 0.3638192000798881, + "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_auto_level_without_levels": 0.001774100004695356, + "spyde/tests/migrated/test_lifecycle.py::TestPaintSignalPlots::test_paints_with_levels_locked": 0.001675899955444038, + "spyde/tests/migrated/test_lifecycle.py::TestProgressEmitter::test_throttles_and_always_emits_final": 0.001948599936440587, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_factory_failure_leaves_none": 0.001631600083783269, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_none_factory_just_removes": 0.0016652001067996025, + "spyde/tests/migrated/test_lifecycle.py::TestReplaceTreeAttr::test_removes_old_and_sets_new": 0.0017239999724552035, + "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_falls_back_to_any_tree": 0.0007652000058442354, + "spyde/tests/migrated/test_lifecycle.py::TestResolveVectors::test_prefers_plot_tree": 0.0007665000157430768, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_error_calls_on_error": 0.004551899968646467, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_inline_without_session": 0.0016505998792126775, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_marshals_on_done_to_loop_thread": 0.005837000091560185, + "spyde/tests/migrated/test_lifecycle.py::TestRunOnWorker::test_worker_error_reaches_on_error": 0.006122400052845478, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_fires_then_once_vectors_attach": 0.6302184000378475, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_no_loop_returns_false": 0.0007684000302106142, + "spyde/tests/migrated/test_lifecycle.py::TestWaitForVectors::test_nothing_running_errors_after_grace": 0.3317303998628631, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_all_nan_buffer_is_painted_once": 0.16981689992826432, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_an_unchanged_buffer_is_painted_once": 0.1684459000825882, + "spyde/tests/migrated/test_live_fill_poller.py::TestLiveFillPollerDedupe::test_real_changes_still_paint": 0.11895580019336194, + "spyde/tests/migrated/test_live_overlay.py::test_compute_error_does_not_propagate": 0.0016105999238789082, + "spyde/tests/migrated/test_live_overlay.py::test_stop_is_idempotent_and_halts_worker": 0.052643600036390126, + "spyde/tests/migrated/test_live_overlay.py::test_sync_mode_runs_inline_on_caller": 0.001604899880476296, + "spyde/tests/migrated/test_live_overlay.py::test_thread_mode_is_offthread_singleflight_latest_wins": 0.023889999953098595, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_crop_resolves_local": 0.36759879998862743, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughActions::test_rebin_resolves_local": 0.3755593999521807, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_flat_field_resolves_opaque": 0.4327691001817584, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_auto_per_pattern_resolves_local": 0.34167630004230887, + "spyde/tests/migrated/test_locality_tag.py::TestLocalityThroughCZB::test_manual_constant_shift_resolves_local": 0.3291037998860702, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_chain_of_local_tags_resolves_local": 0.0007017998723313212, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_explicit_opaque_ancestor_poisons_a_locally_tagged_descendant": 0.0007093000458553433, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_memoized_result_does_not_change_after_mutation": 0.0007021001074463129, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_resolving_a_descendant_also_memoizes_ancestors": 0.000701199984177947, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_root_is_always_local": 0.0007171999895945191, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_ancestor_poisons_a_locally_tagged_descendant": 0.0007121999515220523, + "spyde/tests/migrated/test_locality_tag.py::TestResolveLocalityStandalone::test_untagged_node_defaults_opaque": 0.0007036000024527311, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_axes_full_length_match_full_frame": 0.2625986001221463, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_clim_passed_atomically": 0.007068100036121905, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_sent_full_res": 0.27224399999249727, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_large_signal_frame_uses_tile_auto": 0.3145240999292582, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_navigator_frame_full_res_tile_false": 0.2745607999386266, + "spyde/tests/migrated/test_lod_display.py::TestNoDecimation::test_small_frame_sent_full_and_auto": 0.005622100085020065, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_exception_traceback_included": 0.0018287000712007284, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_handler_level_gates_records": 0.0012054999824613333, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_record_becomes_log_message": 0.0014013000763952732, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_reentrancy_guard_blocks_recursion": 0.0022275999654084444, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_ring_buffer_bounded": 0.003775700111873448, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_spyde_info_passes": 0.0011582999723032117, + "spyde/tests/migrated/test_log_stream.py::TestIPCLogHandler::test_thirdparty_info_is_filtered_but_warning_passes": 0.0011802000226452947, + "spyde/tests/migrated/test_log_stream.py::TestInstall::test_install_is_idempotent": 0.002425599843263626, + "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_level_changes_handler_and_root": 0.0018846000311896205, + "spyde/tests/migrated/test_log_stream.py::TestLevelControl::test_set_log_level_staged_handler_backfills": 0.002584699890576303, + "spyde/tests/migrated/test_masks.py::TestVirtualImageNonBlackOnCalibratedData::test_vi_is_nonzero_with_calibrated_signal_axes": 0.005365899996832013, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_annular_mask_is_a_ring_on_calibrated_axes": 0.006845399970188737, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_disk_mask_is_nonempty_on_calibrated_axes": 0.01035340002272278, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_mask_is_calibration_invariant": 0.013703399919904768, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_offcentre_disk_lands_where_the_widget_is": 0.0074862000765278935, + "spyde/tests/migrated/test_masks.py::TestWidgetToMaskCalibration::test_rectangle_mask_on_calibrated_axes": 0.005558699951507151, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_256_dp_buffer_is_about_1mb": 0.002822799957357347, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_buffer_never_256mb": 0.0032501000678166747, + "spyde/tests/migrated/test_memory.py::TestSharedBufferSize::test_fallback_is_modest": 0.0008004000410437584, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_edit_survives_zspy_save_reload": 0.5465280001517385, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_emit_carries_raw_editable_map": 0.21310450008604676, + "spyde/tests/migrated/test_metadata_edit.py::TestMetadataEditPersistence::test_metadata_reemit_reaches_captured_messages": 0.2157787000760436, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_non_finite_numbers_rejected": 0.16554169997107238, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_float_writes_back_and_re_emits": 0.21992859989404678, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_invalid_number_ignored": 0.17293130001053214, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_no_plot_is_noop": 0.008526699966751039, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_readonly_derived_field_ignored": 0.1648062999593094, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_string_field": 0.18072130007203668, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_set_metadata_unknown_cell_ignored": 0.18007300002500415, + "spyde/tests/migrated/test_metadata_edit.py::TestSetMetadataAction::test_units_suffixed_display_string_rejected": 0.1852479000808671, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_bundled": 0.003783399937674403, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_ensure_local_unknown_id": 0.0007912000874057412, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_is_cached_bundled": 0.0007922000950202346, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_resolve_weights_checks_sha": 0.014592200051993132, + "spyde/tests/migrated/test_model_registry.py::TestModelRegistry::test_sha256_verify": 0.018174699973315, + "spyde/tests/migrated/test_model_spec.py::TestCopy::test_copy_is_deep": 0.04185049992520362, + "spyde/tests/migrated/test_model_spec.py::TestCopy::test_lookup_errors_name_what_is_available": 0.03929019998759031, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_all_channels_active_is_stored_as_none": 0.04142440005671233, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_a_restricted_signal_range": 0.04560710000805557, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_bounds_including_absent_ones": 0.0647581999655813, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_components_and_kinds": 0.0453296999912709, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_free_flags": 0.04338930000085384, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_parameter_values": 0.04314620001241565, + "spyde/tests/migrated/test_model_spec.py::TestFromModel::test_reads_the_linear_flag": 0.04616409994196147, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_channel_mask_survives_as_ranges": 0.039076399989426136, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_is_json_serialisable": 0.04021660005673766, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_dict_round_trip": 0.04353020014241338, + "spyde/tests/migrated/test_model_spec.py::TestJson::test_two_disjoint_ranges_survive": 0.0008690999820828438, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_component_slices_isolate_each_component": 0.041170400101691484, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_inactive_components_occupy_no_columns": 0.05779590003658086, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_masks_line_up_with_values": 0.041148100164718926, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_parameter_names_follow_component_then_parameter_order": 0.04496349999681115, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_is_the_inverse_of_flat_values": 0.052621700102463365, + "spyde/tests/migrated/test_model_spec.py::TestPackedOrder::test_set_flat_values_rejects_the_wrong_width": 0.04667609999887645, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_bounds_are_set_before_values": 0.03813660005107522, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_inactive_component_survives_the_round_trip": 0.08158040000125766, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_replaces_any_prepopulated_components": 0.01106670021545142, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_bounds_and_free_flags": 0.1061284999595955, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_kinds_and_values": 0.08819380006752908, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_round_trip_preserves_the_signal_range": 0.09096679999493062, + "spyde/tests/migrated/test_model_spec.py::TestToModel::test_unknown_kind_is_a_clear_error": 0.011590400012210011, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_keeps_its_subshell_identity": 0.0014736000448465347, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_onsets_survive": 0.0014726000372320414, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips": 0.0014968999894335866, + "spyde/tests/migrated/test_model_spec_init_args.py::TestEelsEdge::test_edge_round_trips_through_json": 0.0015385999577119946, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_high_order_coefficients_are_not_silently_dropped": 0.057755200075916946, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_json": 0.035913800122216344, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[1]": 0.03905329992994666, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[2]": 0.03123939991928637, + "spyde/tests/migrated/test_model_spec_init_args.py::TestPolynomialOrder::test_order_survives_the_round_trip[6]": 0.056461800006218255, + "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_components_without_init_args_are_unaffected": 0.078386600012891, + "spyde/tests/migrated/test_model_spec_init_args.py::TestUnrebuildableComponent::test_missing_init_args_give_an_actionable_error": 0.0015312000177800655, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_empty_movie_cell_is_placeholder": 0.22567860002163798, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_open_emits_edit_open": 0.23581189999822527, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_add_movie_cell_seeded_from_plot": 0.26594279997516423, + "spyde/tests/migrated/test_movie_block.py::TestDocumentHandlers::test_set_movie_source": 0.25711020012386143, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_close_drops_session": 0.23542769998311996, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_open_emits_state_shape": 0.29122120002284646, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_clamps_to_range": 0.24744810000993311, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_scrub_drives_real_navigator": 0.28394130000378937, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_clamps_time_range": 0.22520760004408658, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_half_open_clim_does_not_raise": 0.2461953000165522, + "spyde/tests/migrated/test_movie_block.py::TestEditorSession::test_tune_persists_onto_spec": 0.23634219996165484, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_gif_emits_done_and_bakes_poster": 0.30025109997950494, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_export_respects_crop": 0.33350890001747757, + "spyde/tests/migrated/test_movie_block.py::TestExport::test_freeze_grows_frame_count": 0.3229286000132561, + "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_export_never_computes_full_array": 0.31035919999703765, + "spyde/tests/migrated/test_movie_block.py::TestMemorySafety::test_scrub_never_computes_full_array": 0.2694558999501169, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_remove_movie_cell_tears_down_widgets": 0.22430449991952628, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_reopen_after_close_restores_widgets_from_persisted_spec": 0.23575140011962503, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_close_tears_down_widgets": 0.24902239989023656, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_report_new_tears_down_widgets_but_keeps_cell_persistence": 0.23877059994265437, + "spyde/tests/migrated/test_movie_block.py::TestOverlayScopingAcrossExitPaths::test_view_outside_editor_after_close_shows_no_overlays": 0.23778909991960973, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_add_text_overlay_from_1d_window": 0.2712615999625996, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_annotation_widgets_drag_persists_to_spec": 0.2310693000908941, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_offsets_annotation_coordinates_in_export": 0.3243788998806849, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_widget_on_figure_persists": 0.2365049000363797, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_crop_zooms_the_live_figure": 0.250955100171268, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_overlay_image_composited_in_export": 0.49053940002340823, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_play_emits_frames_and_stops": 0.3974074999568984, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_render_params_apply_to_live_figure": 0.23115739994682372, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_speed_segment_slows_the_export": 0.39842110010795295, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_static_2d_overlay_image_composites": 0.3648567000636831, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_live_value_on_figure": 0.30406820005737245, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_text_overlay_value_in_export": 0.33784750010818243, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_time_gated_annotation_shows_only_in_window": 0.2824563999893144, + "spyde/tests/migrated/test_movie_block.py::TestOverlays::test_tune_persists_annotations_and_freezes": 0.25849699997343123, + "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_keeps_using_same_plot_as_outside_editor": 0.35853909992147237, + "spyde/tests/migrated/test_movie_block.py::TestTileModeInEditor::test_scrub_in_editor_routes_through_gpu_tile": 0.36236260004807264, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_2d_nav_4dstem_still_spans_signal": 0.009991700062528253, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_4dstem_whole_signal_small_nav_block_left_alone": 0.010847600060515106, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_explicit_nav_chunk_override_is_honoured": 0.01092529995366931, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_frame_gets_one_frame_per_chunk": 0.028977200156077743, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_large_movie_gets_one_frame_per_chunk": 0.014366599963977933, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_medium_frame_byte_target_on_4dstem": 0.01809780008625239, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_movie_whole_signal_multi_frame_block_is_recut_to_one": 0.011849100003018975, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_non_navigated_2d_image_returns_none": 0.007681400049477816, + "spyde/tests/migrated/test_movie_chunking.py::TestAdaptiveChunking::test_small_dp_packs_many_but_capped": 0.010745799983851612, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_no_bare_hs_load_in_the_file_session": 0.003763799904845655, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_open_lazily_can_take_chunks": 0.001891000079922378, + "spyde/tests/migrated/test_movie_chunking.py::TestEveryLoadPathIsAligned::test_the_examples_path_aligns_too": 0.0026317000156268477, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_a_reader_that_rejects_chunks_still_loads": 0.05778119992464781, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_it_leaves_a_good_chunking_alone": 0.05213419999927282, + "spyde/tests/migrated/test_movie_chunking.py::TestLoadAligned::test_mrc_comes_back_with_whole_signal_chunks": 0.040389099973253906, + "spyde/tests/migrated/test_movie_chunking.py::TestMovieFixture::test_movie_opens_with_1d_time_navigator": 0.232863099896349, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_4dstem_scan_still_prompts": 0.008897199877537787, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_large_image_frames_skip_prompt_even_if_axis_unnamed": 0.011022499878890812, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_small_dp_stack_still_prompts": 0.013905199826695025, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_time_axis_movie_skips_prompt": 0.010543299955315888, + "spyde/tests/migrated/test_movie_chunking.py::TestMoviePromptSkip::test_z_stack_skips_prompt": 0.011530200019478798, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_cropped_view_scrubs": 0.0361855000955984, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadDerivedViews::test_rebinned_view_scrubs": 0.032187000033445656, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadFallThrough::test_eager_falls_through": 0.003901299904100597, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_region_block_bounded_to_block": 0.0851097998674959, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadMemoryBounded::test_single_frame_on_monolithic_chunk_is_bounded": 0.03459339996334165, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_large_region_stays_bounded": 0.12685459991917014, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_mean_matches_get_index": 0.038132699904963374, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadRegion::test_region_rounds_integer_source": 0.012111800024285913, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_4dstem_diffraction_pattern": 0.010539100039750338, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_matches_get_index_movie": 0.02529229992069304, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_movie_single_frame": 0.02230539999436587, + "spyde/tests/migrated/test_movie_direct_read.py::TestDirectReadSinglePoint::test_out_of_range_index_read_raises_to_none": 0.01214790006633848, + "spyde/tests/migrated/test_movie_export.py::TestAnnotations::test_rect_only_in_frames_3_to_6": 0.42032720008865, + "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_before_run_raises_before_probe_and_no_output": 0.015211100107990205, + "spyde/tests/migrated/test_movie_export.py::TestCancellation::test_cancel_leaves_no_partial_file": 0.0986778000369668, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_downsample_dimensions_even_cropped": 0.16935290000401437, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_gif_decodable": 0.1665414001327008, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_mp4_exists_and_frame_count": 0.3436294998973608, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_odd_downsample_even_crop": 0.1904290000675246, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_stride": 0.26438009995035827, + "spyde/tests/migrated/test_movie_export.py::TestEncodeReadback::test_time_range": 0.27283610007725656, + "spyde/tests/migrated/test_movie_export.py::TestFfmpegMissing::test_ffmpeg_ok_false_when_probe_raises": 0.0023128000320866704, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_apply_lut_non_blank_and_differs": 0.002266600029543042, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_downsample_halves": 0.0010341000743210316, + "spyde/tests/migrated/test_movie_export.py::TestLUT::test_lut_shape_and_range": 0.0014283000491559505, + "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_never_computes_full_array": 0.31422770000062883, + "spyde/tests/migrated/test_movie_export.py::TestMemorySafety::test_read_frame_is_single_frame": 0.02384250017348677, + "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_fit_frame_pads_and_crops": 0.0019873998826369643, + "spyde/tests/migrated/test_movie_export.py::TestRaggedFrames::test_smaller_tail_frame_is_letterbox_padded": 0.2757263999665156, + "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_inset_changes_pixels_in_inset_region": 0.45546440000180155, + "spyde/tests/migrated/test_movie_export.py::TestTraceInset::test_resample_clamps": 0.002014600089751184, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_fps_key_preferred": 0.011301300022751093, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_explicit_key_wins_over_time_axis": 0.01225300005171448, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_fps_derived_from_time_axis": 0.010092000127770007, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_group_present": 0.010998600046150386, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_microsecond_units_converted": 0.010855299886316061, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_minute_units_converted": 0.01137279998511076, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_ms_units_converted": 0.0092838000273332, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_non_time_axis_shows_placeholder": 0.010334000107832253, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_unknown_time_unit_does_not_derive": 0.01138940011151135, + "spyde/tests/migrated/test_movie_metadata.py::TestMovieMetadata::test_zero_scale_does_not_divide": 0.011056800140067935, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_empty_spec_tolerant": 0.000780699891038239, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_partial_dict_tolerant": 0.0007385000353679061, + "spyde/tests/migrated/test_movie_model.py::TestMovieSpecYaml::test_to_from_yaml_roundtrips": 0.010653399978764355, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_full_roundtrip": 0.01579870004206896, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_marker_is_invisible_comment": 0.001514999894425273, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_older_report_without_movies_still_loads": 0.0016161000821739435, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_placeholder_movie_survives_without_poster": 0.019562199944630265, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_schema_version_unchanged": 0.0007763000903651118, + "spyde/tests/migrated/test_movie_model.py::TestReportRoundTrip::test_zip_layout": 0.027614699909463525, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_latest_center_wins": 0.025436999974772334, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_reads_neighbours_around_center": 0.02614730002824217, + "spyde/tests/migrated/test_movie_prefetch.py::TestMoviePrefetch::test_stays_in_bounds": 0.024162800051271915, + "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_generate_library_accepts_multiple_cifs": 5.895761799998581, + "spyde/tests/migrated/test_multiphase_orientation.py::TestMultiPhaseOrientation::test_two_phase_map_and_2d_ipf": 11.194014400010929, + "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_navigator_reports_image_aspect": 0.21753650007303804, + "spyde/tests/migrated/test_nav_aspect.py::TestNavigatorAspect::test_signal_figure_has_no_aspect": 0.21218509995378554, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_current_data_not_set_to_future": 0.017893899814225733, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_failed_read_releases_slot": 0.020201500039547682, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_int_region_mean_is_rounded": 0.017414500005543232, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_region_mean_matches_numpy": 0.020987699972465634, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_settle_flag_requests_full_res": 0.01816170010715723, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_single_frame_paints_correct_data": 0.02465710008982569, + "spyde/tests/migrated/test_nav_async_cancel.py::TestAsyncNavRead::test_supersede_cancels_prior_future": 0.017280400032177567, + "spyde/tests/migrated/test_nav_async_cancel.py::TestComputeBackendShutdownGuard::test_backend_none_after_shutdown_no_executor_recreate": 0.008399199927225709, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_nav_pool_is_serial": 0.001813800074160099, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_sequence_advances_per_submission": 0.017459900118410587, + "spyde/tests/migrated/test_nav_async_cancel.py::TestOutOfOrderFramesNeverPaint::test_stale_frame_does_not_paint_over_a_newer_one": 0.030041999998502433, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_float_region_mean_is_not_rounded": 0.016105099814012647, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_integer_region_mean_is_rounded_to_source_dtype": 0.016474600066430867, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_result_is_never_a_future": 0.010955899953842163, + "spyde/tests/migrated/test_nav_cached_read.py::TestCachedNavRead::test_single_point_returns_exact_frame_as_ndarray": 0.012327900039963424, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_builds_time_and_spatial_selectors": 0.09377329994458705, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_chain_refire_forces_downstream": 0.10489049984607846, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_composed_index_includes_and_tracks_time": 0.08975449996069074, + "spyde/tests/migrated/test_nav_chain_5d.py::TestNavChain5D::test_spatial_upstream_resolves_to_time_composite": 0.09624430001713336, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_does_not_hand_over_near_the_end": 0.0020413000602275133, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_hands_over_once_the_cluster_appears": 0.0017522000707685947, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestHandover::test_never_hands_over_without_a_cluster": 0.002193300169892609, + "spyde/tests/migrated/test_nav_cluster_handover.py::TestWiring::test_the_fill_loop_actually_contains_the_handover": 0.022712199948728085, + "spyde/tests/migrated/test_nav_orientation.py::TestNavOrientation::test_crosshair_selects_data_iy_ix": 0.20821180008351803, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestEnqueuePaint::test_enqueue_sets_current_data_immediately": 0.012431400013156235, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_newest_wins_drops_stale_paint": 0.5136986998841166, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_paint_happens_off_caller_thread": 0.013142700074240565, + "spyde/tests/migrated/test_nav_paint_decouple.py::TestNavPainter::test_slow_paint_does_not_block_submitter": 0.002872499986551702, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_crosshair_selects_frame_while_nav_still_computing": 0.5921436998760328, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_fills_progressively_without_cluster": 0.714736299822107, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_navigator_has_no_holes_when_complete": 0.6991776999784634, + "spyde/tests/migrated/test_nav_progressive.py::TestProgressiveNavigator::test_windows_and_crosshair_ready_before_nav_image": 0.08414269995409995, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestFourDNotRegressed::test_4d_still_uses_the_single_navigator_path": 0.63381579995621, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_both_navigators_fill_from_one_pass": 0.7162552000954747, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_child_navigator_fills_progressively": 0.00481639988720417, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_array_is_what_the_fill_computes": 0.16254409996327013, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_deep_signal_is_committed_in_ram": 0.7537644000258297, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_partial_plane_never_clobbers_a_complete_frame": 0.002262699999846518, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_reduce_deep_nav_masks_incomplete_planes": 0.0019084999803453684, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_sidecar_round_trip_skips_the_compute_entirely": 0.8439326998777688, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_move_reads_the_committed_array": 0.8008016999810934, + "spyde/tests/migrated/test_nav_progressive_5d.py::TestProgressiveNavigator5D::test_time_navigator_never_shows_a_partial_sum": 0.7665333998156711, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_distributed_mode_does_not_use_the_client": 0.01690349995624274, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_future_is_cancellable": 0.01507649989798665, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_shutdown_is_idempotent": 0.0007128999568521976, + "spyde/tests/migrated/test_nav_read_never_distributed.py::TestNavReadStaysLocal::test_threaded_mode_uses_the_existing_executor": 0.013203300070017576, + "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_crossing_chunk_boundary_decodes_once_then_dwells": 0.41378719988279045, + "spyde/tests/migrated/test_nav_rebin_no_block.py::TestRebinSyncCached::test_dwell_in_chunk_is_fast_no_redecode": 0.6181721998145804, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[1.0-0.0]": 0.21993789996486157, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[2.5-10.0]": 0.21632130001671612, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_crosshair_pixel_maps_to_same_index_regardless_of_calibration[3.0-0.0]": 0.22703540010843426, + "spyde/tests/migrated/test_nav_scale.py::TestNavScaleIndexMapping::test_scaled_navigator_selects_correct_diffraction_pattern": 0.36999529995955527, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_4d_load_emits_prompt_and_does_not_open": 0.01746899983845651, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_applies_step_size_and_opens": 0.22980589990038425, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_reshapes_flat_stack_lazily": 0.2429132000543177, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_confirm_with_wrong_frame_count_falls_back": 0.24686500011011958, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_open_file_emits_busy_then_clears": 0.13457749993540347, + "spyde/tests/migrated/test_nav_shape_prompt.py::TestNavShapePrompt::test_plain_2d_image_does_not_prompt": 0.015097500057891011, + "spyde/tests/migrated/test_nav_sidecar.py::TestNavFillDeferral::test_fill_waits_for_first_signal_frame": 0.10694560001138598, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_fill_saves_sidecar_and_reopen_skips_compute": 0.7878944000694901, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_no_sidecar_for_pseudo_paths": 0.06441270012874156, + "spyde/tests/migrated/test_nav_sidecar.py::TestSessionIntegration::test_override_navigator_never_uses_sidecar": 0.10728459991514683, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_1d_movie_navigator": 0.021900199935771525, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_missing_or_corrupt_sidecar": 0.014154399977996945, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_modified_source_invalidates": 0.0297894001705572, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_partial_fill_never_cached": 0.004335799952968955, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_save_then_load": 0.029558299924246967, + "spyde/tests/migrated/test_nav_sidecar.py::TestSidecarRoundTrip::test_shape_mismatch_misses": 0.020550400018692017, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_cold_huge_frame_is_expensive": 0.0026885000988841057, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_cached_small_frame_is_cheap": 0.0027570001548156142, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_derived_huge_frame_stays_cheap": 1.2561548000667244, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_huge_frame_resident_in_the_array_cache_is_cheap": 0.006769499974325299, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyCachedCold::test_never_computes": 0.002706700121052563, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_a_few_points_stays_cheap": 0.003777700010687113, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_UNCACHED_points_is_expensive_even_when_small": 0.0039808000437915325, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_many_points_of_BIG_frames_is_expensive": 0.004146599909290671, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_medium_region_below_async_cap_is_cheap": 0.004012400051578879, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_region_by_bytes_is_expensive": 0.0038207999896258116, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifyRegion::test_small_region_is_cheap": 0.004292499972507358, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_cropped_view_single_point_is_cheap_now": 0.0018014999805018306, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_raw_movie_single_point_is_cheap": 0.0012202000943943858, + "spyde/tests/migrated/test_nav_tiered_classify.py::TestClassifySinglePoint::test_rebinned_view_single_point_is_cheap_now": 0.0038654000964015722, + "spyde/tests/migrated/test_navigator_race.py::test_latest_position_wins_under_burst": 0.06342260004021227, + "spyde/tests/migrated/test_navigator_race.py::test_newer_submission_coalesces_older_one": 0.06360879994463176, + "spyde/tests/migrated/test_navigator_race.py::test_updates_run_serially_never_concurrently": 0.0625282998662442, + "spyde/tests/migrated/test_neural_batch_memory.py::TestNeuralBatchMemory::test_peak_memory_scales_with_batch_not_stack_size": 5.82329920004122, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_batch_matches_single": 0.0006751999026164412, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_bundled_model_loads": 5.402945200097747, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_detect_localises_planted_spots": 0.0008428002474829555, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_fallback": 0.0006334999343380332, + "spyde/tests/migrated/test_neural_detect.py::TestNeuralDetect::test_registry_upgrade_merge": 0.0006847000913694501, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_clear_is_a_noop_without_a_crosshair": 0.22546309989411384, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_drag_release_drag_again": 0.23159189999569207, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_navigator_plot_edits_navigation_axes": 0.23254770005587488, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_node_switch_clears_the_crosshair": 0.21483889990486205, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_refused_toggle_reports_off": 0.2144431999186054, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_stable_across_repeated_moves": 0.23594629997387528, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_starts_at_current_offset_no_change_until_drag": 0.20822999998927116, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_emits_pick_state": 0.21631669998168945, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_off_removes_crosshair": 0.229867999907583, + "spyde/tests/migrated/test_offset_crosshair.py::TestOffsetCrosshair::test_toggle_on_sets_offset_so_crosshair_is_origin": 0.20339549996424466, + "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_returns_single_2d_frame_from_5d": 0.0007156999781727791, + "spyde/tests/migrated/test_open_stack.py::TestFindVectorsPreviewOnStack::test_blurred_frame_still_works_for_4d": 0.0006692999741062522, + "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_only_spatial_pair_is_transposed": 0.0006853999802842736, + "spyde/tests/migrated/test_open_stack.py::TestMultiNavIndexOrdering::test_overlay_helpers_split_lead_and_spatial": 0.000651199952699244, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_fewer_than_two_files_errors": 0.01895989989861846, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_mismatched_shapes_cropped_with_warning": 0.20594969997182488, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_per_file_scan_calibration_carried_over": 0.19526200008112937, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_signal_type_carried_over": 0.18568940018303692, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stack_axis_is_generic_index": 0.25309880007989705, + "spyde/tests/migrated/test_open_stack.py::TestOpenStack::test_stacks_two_4d_into_5d_lazy": 0.21069550001993775, + "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_load_cif_library_refine": 4.8569383000722155, + "spyde/tests/migrated/test_orientation_ag.py::TestAgSilverWorkflow::test_template_spots_match_pyxem": 0.2991127000423148, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_chunked_equals_single_chunk": 0.20823449990712106, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_live_shm_rgb_written": 0.23637490009423345, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_never_computes_full_dataset": 0.15061939996667206, + "spyde/tests/migrated/test_orientation_compute.py::TestChunkingAndMemory::test_stopped_flag_returns_none": 0.013083300087600946, + "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_phase_recovered": 8.914677000022493, + "spyde/tests/migrated/test_orientation_compute.py::TestMultiphase::test_template_tables_match_get_simulation": 0.42427539988420904, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_correlation_sorted_and_positive": 0.06156560010276735, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_inplane_delta": 0.28756530000828207, + "spyde/tests/migrated/test_orientation_compute.py::TestPyxemConsistency::test_rows_and_quats_match_pyxem": 53.98419039999135, + "spyde/tests/migrated/test_orientation_compute.py::TestResolveQuaternions::test_identity_roundtrip": 0.3364601001376286, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_color_map_directions_differ": 0.03650039993226528, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_correlation_and_phase_maps": 0.001151299919001758, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_color_map": 0.02230990002863109, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_matches_direct_orix": 0.009092000080272555, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_counts_and_subsample": 0.012529999949038029, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xy_roi_multiphase_partition": 0.010224699974060059, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_encodes_inplane_rotation": 0.011578000034205616, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_ipf_xyz_geometry": 0.0096261000726372, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_save_load_roundtrip": 0.08502940007019788, + "spyde/tests/migrated/test_orientation_map.py::TestContainer::test_shapes_and_props": 0.0008984000887721777, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_identity_rotation_projects_z_to_origin": 0.005134899984113872, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_triangle_outline_nonempty": 0.01606039993930608, + "spyde/tests/migrated/test_orientation_map.py::TestIPFHelpers::test_xy_inside_sector_bounds": 0.02029060001950711, + "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_orientation_end_to_end_on_lazy_data": 9.365874500013888, + "spyde/tests/migrated/test_orientation_overlay.py::TestOrientationOverlay::test_overlay_attaches_and_draws_template_spots": 8.17183600005228, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_entry_rejects_missing_cif": 0.39258180011529475, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_orientation_builds_ipf_window_and_attaches_map": 2.8617114000953734, + "spyde/tests/migrated/test_orientation_port.py::TestOrientationPort::test_source_overlay_attaches_before_the_batch": 0.3132830000249669, + "spyde/tests/migrated/test_orientation_port.py::test_plot_renders_rgb_image": 0.0019427998922765255, + "spyde/tests/migrated/test_orientation_wizard.py::TestOrientationWizard::test_generate_refine_run": 10.763621300109662, + "spyde/tests/migrated/test_overlay_layers.py::TestColdSourceReadWarms::test_cold_derived_read_skips_then_warms_then_paints": 0.04113290004897863, + "spyde/tests/migrated/test_overlay_layers.py::TestDeadLayerSkip::test_dead_layer_not_read_or_painted": 0.5168626999948174, + "spyde/tests/migrated/test_overlay_layers.py::TestEagerRegionParity::test_eager_region_mean_is_unrounded": 0.01173419994302094, + "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_async_tier_move_skips_without_error": 0.5903347000712529, + "spyde/tests/migrated/test_overlay_layers.py::TestLiveNavRefresh::test_nav_move_refreshes_layer": 1.1766536999493837, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_add_layer_same_shape": 0.37231990008149296, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_query_reemits_state": 0.3737841999391094, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_self": 0.23360709997359663, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayAdd::test_refuse_shape_mismatch": 0.22264280007220805, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlaySet::test_set_reflected_in_layer_state": 0.3647614000365138, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_remove_layer": 0.3867308999178931, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_source_close_drops_layers_on_target": 0.4047366000013426, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_target_close_drops_layers": 0.39237799996044487, + "spyde/tests/migrated/test_overlay_layers.py::TestOverlayTeardown::test_tile_mode_refused": 0.3621031000511721, + "spyde/tests/migrated/test_overlay_layers.py::TestPendingFramesRace::test_write_between_read_and_clear_is_not_lost": 0.311865400057286, + "spyde/tests/migrated/test_overlay_layers.py::TestShapeChangeDropsLayers::test_shape_changing_paint_drops_layers_cleanly": 0.38642950006760657, + "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_found_vectors_overlay_hides_on_deselect": 1.212674600072205, + "spyde/tests/migrated/test_overlay_visibility.py::TestOverlayVisibility::test_set_overlay_unknown_is_noop": 0.2016746000153944, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_changed_nav_grid_declines": 0.01252560003194958, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_identity_rebin_declines": 0.008825000026263297, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_no_parent_declines": 0.014591899933293462, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_non_integer_rebin_factor_declines": 0.011467500007711351, + "spyde/tests/migrated/test_per_frame_reader.py::TestDeclinesWhatItCannotReproduce::test_unknown_transformation_declines": 0.014950700104236603, + "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_parent_reader_is_shared_not_rebuilt": 0.01572440005838871, + "spyde/tests/migrated/test_per_frame_reader.py::TestParentBlockDoesTheWork::test_residency_follows_the_parent": 0.017106999875977635, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_dtype_matches_the_derived_signal": 0.017055799951776862, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_frame_matches_the_dask_view": 0.027849500067532063, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_reader_resolves_to_per_frame": 0.019185599987395108, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_matches_a_plain_per_frame_mean": 0.04980450007133186, + "spyde/tests/migrated/test_per_frame_reader.py::TestRebinIsServedPerFrame::test_region_spanning_parent_chunks": 0.06044340005610138, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_html_is_small": 0.2077094999840483, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_figure_imports_shared_bundle": 0.21457049995660782, + "spyde/tests/migrated/test_perf.py::TestSharedBundle::test_shared_bundle_written_once": 0.3329657999565825, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_crosshair": 0.0016673000063747168, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_does_not_match_a_2d_rectangle_selector": 0.0016986001282930374, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_effective_scale_seconds_helpers": 0.001880900003015995, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fallback_to_default_fps_on_garbage_scale": 0.0009434999665245414, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_cycles_speed": 0.007530300063081086, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_fast_forward_emits_speed_in_state": 0.0033979000290855765, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_frame_skipping_tracks_wall_time": 0.6040514000924304, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_garbage_scale_still_plays_at_default": 0.1049063999671489, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_loop_wraps_to_start": 0.2292851998936385, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_matches_a_1d_line_and_range_selector": 0.001694600097835064, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_no_movie_selector_is_noop": 0.00176620006095618, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_non_insitu_tree_is_not_played": 0.0017130000051110983, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_pause_stops_advancing": 0.40524270001333207, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_advances_frames": 0.10625740012619644, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_play_toggle_pauses_while_fast_forwarding": 0.002099999925121665, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_realtime_pacing_from_scale": 0.6041073000524193, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_restart_does_not_desync_playing_state": 0.4116272999672219, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_single_step": 0.0018620999762788415, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_speed_multiplier_advances_faster": 0.8062541999388486, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_stops_at_last_frame_without_loop": 0.06592600012663752, + "spyde/tests/migrated/test_playback.py::TestPlayback::test_units_ms_behaves_like_seconds": 0.6041794999036938, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_fast_forward_via_dispatch_cycles_speed": 0.22675659996457398, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_play_then_pause_via_dispatch": 0.4020619000075385, + "spyde/tests/migrated/test_playback.py::TestPlaybackSessionWiring::test_session_playback_property_and_dispatch": 0.45085049991030246, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_calibrated_x_axis_reaches_set_data": 0.0035260000731796026, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_default_y_label_is_intensity": 0.0025087001267820597, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_edit_units_repropagates_on_repaint": 0.006060400046408176, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_length_mismatch_keeps_default_x_axis": 0.002810999983921647, + "spyde/tests/migrated/test_plot_labels.py::TestLine1DCalibration::test_signal_quantity_overrides_default_y_label": 0.002579500083811581, + "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_nav_axis_edit_reaches_navigator_display_axes": 0.2272471998585388, + "spyde/tests/migrated/test_plot_labels.py::TestNavAxisEdit::test_signal_plot_still_uses_signal_axes": 0.22275110008195043, + "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_apply_plot_title_pushes_dataset_name": 0.003403700073249638, + "spyde/tests/migrated/test_plot_labels.py::TestPlot2DTitle::test_empty_title_leaves_strip_blank": 0.003383200033567846, + "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_ignores_blank": 0.21985049999784678, + "spyde/tests/migrated/test_plot_labels.py::TestSetTitle::test_set_title_updates_root_and_emits": 0.2095467000035569, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_1d_scan_works": 0.0019469000399112701, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_a_corner_has_two_neighbours": 0.002157699898816645, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_an_interior_position_has_four": 0.0021592999109998345, + "spyde/tests/migrated/test_polish.py::TestNeighbourIndex::test_they_are_actual_neighbours": 0.002380399964749813, + "spyde/tests/migrated/test_polish.py::TestPolish::test_a_clean_scan_needs_no_passes": 0.027355600032024086, + "spyde/tests/migrated/test_polish.py::TestPolish::test_a_signal_with_no_grid_is_left_alone": 0.012794800102710724, + "spyde/tests/migrated/test_polish.py::TestPolish::test_it_never_makes_a_position_worse": 0.027340199914760888, + "spyde/tests/migrated/test_polish.py::TestPolish::test_it_rescues_a_sabotaged_position": 0.10509080009069294, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_corner_is_not_judged_on_chisq_alone": 0.0027183000929653645, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_local_outlier_is_caught": 0.0023135000374168158, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_position_that_did_not_converge_is_poor_whatever_its_chisq": 0.001141499960795045, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_a_sharp_edge_can_be_flagged": 0.0026818999322131276, + "spyde/tests/migrated/test_polish.py::TestPoorMask::test_poor_is_local_not_absolute": 0.004506799741648138, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_cpu_device_uses_numpy_reference": 0.024162400048226118, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_gpu_prep_env_gate": 0.0009529999224469066, + "spyde/tests/migrated/test_preprocess_torch.py::TestBuildInputStack::test_torch_prep_path_matches_numpy_on_cpu_tensor": 0.05612729990389198, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_canonical_scale_factor_matches": 0.0021573000121861696, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_gaussian_blur_matches_scipy": 0.043508099974133074, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_normalize_input_matches_numpy": 0.04063559998758137, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_pad_to_multiple_matches_numpy": 0.0027845000149682164, + "spyde/tests/migrated/test_preprocess_torch.py::TestPreprocessTorchParity::test_scale_matches_scipy_zoom": 0.015138000017032027, + "spyde/tests/migrated/test_preview_setparams.py::test_navigation_path_renders_via_engine": 0.012491700006648898, + "spyde/tests/migrated/test_preview_setparams.py::test_set_params_rerenders_peaks": 0.024596700095571578, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_different_blocks_sample_different_positions": 0.0017225000774487853, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_deterministic_per_block": 0.0009950000094249845, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_sample_is_inside_the_block": 0.0016669000033289194, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestBlockSampling::test_single_position_block": 0.0008654000703245401, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_batch_attaches_a_preview_and_feeds_it": 1.2789946999400854, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestFindVectorsWiring::test_teardown_closes_the_preview": 1.1754624000750482, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_compaction_drops_the_padding": 0.0008577998960390687, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_empty_position_renders_blank_not_none": 0.0008772998116910458, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_matches_the_finalized_render": 0.0012867999030277133, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_renders_a_disk_at_the_peak": 0.0010639999527484179, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_store_is_capped": 0.000980400014668703, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestLiveVectorFrames::test_unknown_position_renders_none": 0.0008522998541593552, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestOrchestratorPlumbing::test_on_chunk_block_is_optional": 0.0008465999271720648, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_attaches_to_a_navigator_plus_signal_window": 0.062434199964627624, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_block_paints_a_sample_frame": 0.06704289990011603, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_does_not_clobber_the_final_display": 0.07159960002172738, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_close_restores_the_original_slice_fn": 0.07151309994515032, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_computed_position_renders_on_demand": 0.0826078001409769, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_no_navigator_window_is_a_no_op": 0.02967609988991171, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_out_of_bounds_index_is_not_ready": 0.07560820004437119, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_parked_navigator_refires_instead_of_sampling": 0.07355880015529692, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_sample_paints_are_throttled": 0.05787920008879155, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_served_and_declined_reads_are_counted": 0.07327029993757606, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_uncomputed_position_returns_none": 0.07280379987787455, + "spyde/tests/migrated/test_progressive_signal_preview.py::TestProgressiveSignalPreview::test_user_drag_holds_off_the_sampler": 0.07400279981084168, + "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_eager_virtual_image_is_nonzero": 0.2941216001054272, + "spyde/tests/migrated/test_progressive_vi.py::TestVirtualImageDisplay::test_lazy_virtual_image_is_nonzero": 0.3214445000048727, + "spyde/tests/migrated/test_progressive_windowed.py::TestVirtualImageMaskedSum::test_einsum_path_matches_product_reference": 0.05381080007646233, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_cancel_cancels_every_outstanding_chunk": 0.024319399963133037, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_error_propagates_via_result": 0.013037899974733591, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_primes_small_then_sends_the_rest_in_one_submit": 0.035963699920102954, + "spyde/tests/migrated/test_progressive_windowed.py::TestWindowedProgressive::test_stop_event_halts_topups": 0.5093356999568641, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_background_is_ignored": 0.0011795000173151493, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_inactive_components_are_excluded": 0.0019306001486256719, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_lines_filter_selects_one_line": 0.001247999956831336, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_negative_intensities_are_clamped": 0.0016940999776124954, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_one_map_per_element": 0.0017583000008016825, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_reads_a_tabulated_edge_intensity": 0.0019199999514967203, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_reshapes_to_the_scan": 0.0019401999888941646, + "spyde/tests/migrated/test_quantify.py::TestBridge::test_sums_a_family": 0.0012555000139400363, + "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_quantify_result_carries_the_raw_maps": 0.000964700011536479, + "spyde/tests/migrated/test_quantify.py::TestEndToEnd::test_recovers_the_composition_the_data_was_built_from": 0.0017636999255046248, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[C_K-want3]": 0.0014364998787641525, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Cu_Kb1-want2]": 0.0014182000886648893, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[Fe_Ka-want0]": 0.0014883000403642654, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_parses_element_and_line[O_K-want1]": 0.001418700092472136, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[Offset]": 0.0013448998797684908, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[PowerLaw]": 0.0012765000574290752, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[]": 0.0012623000657185912, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[background_order_6]": 0.001274599926546216, + "spyde/tests/migrated/test_quantify.py::TestParseLine::test_rejects_non_lines[not-a-line]": 0.0013340000296011567, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_cliff_lorimer_applies_k_factors": 0.002006000024266541, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_eels_divides_by_cross_section": 0.0012487998465076089, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_fractions_sum_to_one_across_a_map": 0.0011656999122351408, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_missing_factors_default_and_are_reported": 0.0008542999858036637, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_no_maps_is_an_error": 0.0009085000492632389, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_relative_normalises_to_one": 0.0019943000515922904, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_result_says_it_is_relative": 0.000851399963721633, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_unknown_method_is_rejected": 0.0009783999994397163, + "spyde/tests/migrated/test_quantify.py::TestQuantify::test_zero_signal_is_nan_not_a_divide_error": 0.0008697999874129891, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_short_movie_cannot_seed_past_the_end": 0.2098085000179708, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_a_usable_span_survives_toggling_off_and_on": 0.21509169996716082, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_first_integrate_gives_the_default_width_not_the_whole_axis": 0.19681580003816634, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_it_centres_on_the_crosshair": 0.2034294999903068, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_the_drawn_span_matches_the_frames_actually_read": 0.222120700054802, + "spyde/tests/migrated/test_region_extent_cap.py::TestDefaultSpanOnFirstIntegrate::test_uncalibrated_axis_still_gets_the_default": 0.21907830005511642, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_geometry_clamped_on_resize": 0.2215078998124227, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_rectangle_indices_bounded_per_dim": 0.23191900015808642, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_geometry_clamped_on_resize": 0.2099593001184985, + "spyde/tests/migrated/test_region_extent_cap.py::TestRegionExtentCap::test_span_indices_bounded": 0.21619879989884794, + "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_rectangle_widget_carries_the_cap": 0.2184725000988692, + "spyde/tests/migrated/test_region_extent_cap.py::TestWidgetSideCap::test_span_widget_cap_tracks_the_axis_scale": 0.22207749995868653, + "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_a_contended_read_does_not_wait": 0.005205799941904843, + "spyde/tests/migrated/test_region_integrator.py::TestConcurrentCallers::test_concurrent_reads_all_return_the_right_frame": 0.08572139998432249, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_clamped_span_reads_one_frame_not_n": 0.0012787999585270882, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_duplicates_do_not_disturb_a_live_running_sum": 0.002202599891461432, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_float_source_with_duplicates_is_still_exact": 0.0013882000930607319, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs0]": 0.0017547999741509557, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs1]": 0.0016417999286204576, + "spyde/tests/migrated/test_region_integrator.py::TestDuplicatePoints::test_weighted_mean_matches_the_serial_loop[idxs2]": 0.0028834999538958073, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float32]": 0.0013601999962702394, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[float64]": 0.0016012000851333141, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[int32]": 0.0014074998907744884, + "spyde/tests/migrated/test_region_integrator.py::TestFinalizeSum::test_matches_the_inline_tail[uint16]": 0.0013667000457644463, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_float64_accumulator": 0.0009820000268518925, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_declines_a_small_frame_without_importing_torch": 0.0009834000375121832, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[0-False]": 0.0011814000317826867, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[1-True]": 0.0026660000439733267, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[no-False]": 0.0012130001559853554, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_env_switch[true-True]": 0.0012225998798385262, + "spyde/tests/migrated/test_region_integrator.py::TestGpuGating::test_off_by_default": 0.0020243999315425754, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_a_jump_with_no_overlap_still_matches": 0.005804600077681243, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_float_source_never_goes_incremental": 0.004161800025030971, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_resize_changes_the_divisor_correctly": 0.007891199900768697, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slid_window_matches_a_cold_recompute": 0.016087000025436282, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_slide_touches_only_the_entering_and_leaving_frames": 0.006291399826295674, + "spyde/tests/migrated/test_region_integrator.py::TestIncrementalSlide::test_uint16_running_sum_is_exact_at_the_cap": 0.003226500004529953, + "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_a_different_signal_key_does_not_reuse_the_sum": 0.004164600046351552, + "spyde/tests/migrated/test_region_integrator.py::TestInvalidation::test_invalidate_forces_a_recompute": 0.004180700168944895, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_2d_nav_points_match": 0.001837399904616177, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_band_split_does_not_reorder_summation": 0.0020236000418663025, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[16]": 0.0028795998077839613, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[17]": 0.0027873999206349254, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[1]": 0.0027481999713927507, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[256]": 0.00830440002027899, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[2]": 0.002729899948462844, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[3]": 0.002804500050842762, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_every_region_size_matches[5]": 0.0027042001020163298, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float32]": 0.003482400090433657, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[float64]": 0.004031199961900711, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int16]": 0.0034128999104723334, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[int32]": 0.003557800082489848, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint16]": 0.00730549986474216, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_full_recompute_matches[uint8]": 0.01574810000602156, + "spyde/tests/migrated/test_region_integrator.py::TestParityWithTheSerialLoop::test_threading_off_gives_the_same_answer": 0.004170799977146089, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_clear_restores_the_default": 0.0007242999272421002, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_grows_to_hold_a_big_frame_roi": 0.0007063000230118632, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_is_bounded_by_the_ceiling": 0.0007071000291034579, + "spyde/tests/migrated/test_region_integrator.py::TestRegionBudget::test_never_drops_below_the_default": 0.0007054000161588192, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_float64_accumulator_declines_the_gpu": 0.0007805000059306622, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_cpu_backend_exactly": 0.0008305000374093652, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_matches_the_serial_reference_exactly": 0.0007474999874830246, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[i16-int16]": 0.0009250000584870577, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_other_integer_sources_round_trip[u8-uint8]": 0.0009559999452903867, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_saturated_uint16_stays_exact_at_the_cap": 0.000779499881900847, + "spyde/tests/migrated/test_region_integrator_gpu.py::TestGpuRegionParity::test_the_gpu_path_actually_engaged": 4.351350999902934, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_held_parameter_makes_them_distinguishable": 0.0009803000139072537, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_a_lone_component_is_not": 0.0008129999041557312, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_different_kinds_are_not_exchangeable": 0.0008464998099952936, + "spyde/tests/migrated/test_relabel.py::TestGrouping::test_two_of_a_kind_are_exchangeable": 0.0008954000659286976, + "spyde/tests/migrated/test_relabel.py::TestItDoesNotChangeTheFit::test_the_model_curve_is_unchanged": 0.004559100139886141, + "spyde/tests/migrated/test_relabel.py::TestOnTheRealScan::test_two_gaussians_becomes_consistent": 2.8023418000666425, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_scrambled_scan_becomes_consistent": 0.0028834000695496798, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_a_single_position_is_untouched": 0.0010127000277861953, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_an_already_consistent_scan_is_left_alone": 0.002561699948273599, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_inseparable_components_are_not_reordered": 0.002294400008395314, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_it_permutes_and_invents_nothing": 0.0033463999861851335, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_the_separation_threshold_is_what_decides": 0.0022874000715091825, + "spyde/tests/migrated/test_relabel.py::TestRelabelling::test_whole_components_move_together": 0.0025650999741628766, + "spyde/tests/migrated/test_report_annotation_coords.py::TestCalibratedTextAnnotation::test_text_center_converts_to_pixel_center": 0.012896899948827922, + "spyde/tests/migrated/test_report_annotation_coords.py::TestReversedAxis::test_reversed_x_axis_offsets_and_u_sign": 0.011525699868798256, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_arrow_uv_scale_signed": 0.011807399918325245, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_circle_radius_converts_by_mean_scale": 0.011637400137260556, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_ellipse_widths_heights_convert": 0.01569279993418604, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSizeConversions::test_rect_widths_heights_convert": 0.012671900098212063, + "spyde/tests/migrated/test_report_annotation_coords.py::TestSpecNotMutated::test_build_twice_same_result_and_spec_untouched": 0.021758500137366354, + "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_no_axes_is_identity": 0.010688199894502759, + "spyde/tests/migrated/test_report_annotation_coords.py::TestUncalibratedIdentity::test_unusable_axes_is_identity": 0.012614499893970788, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_default_center_callout": 0.2643433997873217, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_explicit_indices_clamped": 0.2644458001013845, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_no_nav_axes_errors": 0.18405410007108003, + "spyde/tests/migrated/test_report_callouts.py::TestAddCallout::test_rank_mismatch_errors": 0.22152909997384995, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_geometry_change_persists_without_rebuild": 0.20337639993522316, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_spec_round_trips_new_inset_keys": 0.21744670008774847, + "spyde/tests/migrated/test_report_callouts.py::TestInsetGeometryPersist::test_unknown_inset_id_is_silent_noop": 0.23088729998562485, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_clamps": 0.30204809980932623, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_marker_drop_reslices": 0.28563009994104505, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_no_marker_outside_edit_mode": 0.26926159998402, + "spyde/tests/migrated/test_report_callouts.py::TestMarkerDrag::test_unchanged_position_skips_rebuild": 0.25244259997271, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_guards": 0.015511500067077577, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_read_frame_at_lazy_4d_slices_only": 0.02584049990400672, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_time_callouts_compute_single_frames_only": 0.2814500000094995, + "spyde/tests/migrated/test_report_callouts.py::TestMemorySafety::test_zoom_callout_and_drag_never_compute_dataset": 0.2497774000512436, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_2d_image_nav_dims_0": 0.17938139999751002, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_4d_panels_carry_nav_dims_2": 0.21825799997895956, + "spyde/tests/migrated/test_report_callouts.py::TestNavDims::test_movie_panel_nav_dims_1": 0.2365518999285996, + "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_4d_refresh_keeps_position": 0.276745600043796, + "spyde/tests/migrated/test_report_callouts.py::TestRefreshStoredPosition::test_movie_refresh_keeps_time_frames": 0.3723117000190541, + "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_2d_nav_refused": 0.2319019999122247, + "spyde/tests/migrated/test_report_callouts.py::TestTimeCallouts::test_three_insets_start_mid_end": 0.2973784999921918, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_center_region_on_plain_2d_image": 0.2142285001464188, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_default_region_clamped_on_small_image": 0.02466120000462979, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_explicit_region_clamped_to_bounds": 0.2056263000704348, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_on_scene3d_panel": 0.2208244998473674, + "spyde/tests/migrated/test_report_callouts.py::TestZoomCallout::test_refused_without_base_snapshot": 0.19520759989973158, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_no_rect_outside_edit_mode": 0.19051579991355538, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_clamps_to_bounds": 0.2251657001907006, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_rect_drop_recrops": 0.2267810000339523, + "spyde/tests/migrated/test_report_callouts.py::TestZoomRegionDrag::test_unchanged_region_skips_rebuild": 0.20716140000149608, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_defaults_slide_break_false_when_omitted": 0.1970049999654293, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_falls_back_to_active_window": 0.18998700007796288, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_no_active_window_errors_cleanly": 0.1723508001305163, + "spyde/tests/migrated/test_report_capture.py::TestCaptureToPresentation::test_capture_sets_slide_break_and_snapshot": 0.1955381000880152, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_callout_navigator_base_converts_region_to_data": 0.26835120003670454, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_crosshair_selector_gives_no_region": 0.0010328999487683177, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_calibrated": 0.0010712000075727701, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_index_region_to_data_uncalibrated_passthrough": 0.0010213999776169658, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_by_navigator_parent": 0.00114949990529567, + "spyde/tests/migrated/test_report_compose.py::TestCalloutRegionFiltering::test_source_region_uses_selector_linked_to_source": 0.001215500058606267, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_adds_inset": 0.24186990002635866, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_callout_signal_base_has_no_connector": 0.2573717999039218, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_appends_layer": 0.2252210001461208, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_overlay_forced_mismatch_refused": 0.23624749993905425, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_down_then_insert_stays_grid": 0.28179309994447976, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_left_prepends_and_shifts": 0.23996909998822957, + "spyde/tests/migrated/test_report_compose.py::TestComposeModes::test_tile_right_grows_grid": 0.25595070014242083, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_annotation_crud": 0.21661659993696958, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_last_layer_removes_panel_and_collapses_cell": 0.18599549995269626, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_overlay_layer": 0.21837360004428774, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_remove_panel_from_grid": 0.25367770006414503, + "spyde/tests/migrated/test_report_compose.py::TestEdits::test_set_layer_updates_spec": 0.2249946998199448, + "spyde/tests/migrated/test_report_compose.py::TestLayeredAddToReport::test_layered_plot_carries_layers": 0.22473389992956072, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_column_preset": 0.27345249988138676, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_grid_preset": 0.305418899981305, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_hspace_wspace_preserved": 0.3021298999665305, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_inset_panels_untouched": 0.2786624999716878, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_row_preset": 0.2646324000088498, + "spyde/tests/migrated/test_report_compose.py::TestLayoutPresets::test_unknown_preset_errors_no_change": 0.27460339991375804, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_multi_panel_target_excludes_overlay": 0.25864459993317723, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_mismatch_tiles_only": 0.24620030005462468, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_nav_signal_pair_offers_callout": 0.24583759997040033, + "spyde/tests/migrated/test_report_compose.py::TestQueryOptions::test_same_shape_offers_overlay": 0.20795110007748008, + "spyde/tests/migrated/test_report_compose.py::TestRoundTrip::test_composed_spec_roundtrips": 0.2680742999073118, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_hole_fill_no_grid_growth": 0.34910629980731755, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_legacy_no_target_matches_old_semantics": 0.2692569000646472, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_occupied_neighbor_inserts_row_and_shifts": 0.3035748000256717, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_sparse_grid_survives_renormalise_and_build": 0.31334890017751604, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_down_right_panel_makes_2x2": 0.25801809993572533, + "spyde/tests/migrated/test_report_compose.py::TestTileTargeted::test_targeted_tile_left_on_interior_panel_inserts_column": 0.29803169996012, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_closed_state_has_report_type": 0.007380599970929325, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_default_type_is_report": 0.007539300015196204, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_sets_type": 0.008150499896146357, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_report_new_unknown_type_normalizes": 0.007545300060883164, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeHandlers::test_state_emits_type": 0.007672599982470274, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_absent_type_defaults_to_report": 0.0015988999512046576, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_presentation": 0.0058544998755678535, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_front_matter_round_trip_report": 0.002621800056658685, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_movie_type_tolerated": 0.002693900023587048, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_unknown_type_normalizes_to_report": 0.0015771002508699894, + "spyde/tests/migrated/test_report_doc_type.py::TestDocTypeModel::test_zip_round_trip": 0.029594200081191957, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_arrow_linewidth_flows_to_live_widget": 0.21168059995397925, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_circle_linewidth_flows_to_live_widget": 0.21409750008024275, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_rect_linewidth_flows_to_live_widget": 0.21943259984254837, + "spyde/tests/migrated/test_report_edit_mode.py::TestAnnotationStyleFields::test_text_fontsize_flows_to_live_widget": 0.2108155998867005, + "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_circle_drag_updates_offset_and_radius": 0.2142994999885559, + "spyde/tests/migrated/test_report_edit_mode.py::TestDragPersistNoRebuild::test_text_drag_updates_data_no_rebuild": 0.22270520008169115, + "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_edit_on_makes_widgets_off_makes_markers": 0.24156959995161742, + "spyde/tests/migrated/test_report_edit_mode.py::TestEditModeToggle::test_toggle_same_value_is_noop": 0.22596530010923743, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_add_and_remove_fig_annotation_no_rebuild": 0.19722950016148388, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigAnnotationInPlaceUpdate::test_update_fig_annotation_no_rebuild": 0.21195210015866905, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_interactive_sets_edit_chrome_and_markers": 0.22367770003620535, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_non_interactive_sets_markers_not_chrome": 0.21582760009914637, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureBuildEditChrome::test_panel_map_stashed": 0.19545870018191636, + "spyde/tests/migrated/test_report_edit_mode.py::TestFigureMarkerDrag::test_marker_drag_persists_no_rebuild": 0.2160120999906212, + "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_arrow_uv_roundtrip_signed": 0.21418259991332889, + "spyde/tests/migrated/test_report_edit_mode.py::TestGeometryRoundTrip::test_rect_center_topleft_roundtrip": 0.21915429993532598, + "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_after_panel_removed_no_change": 0.2149361000629142, + "spyde/tests/migrated/test_report_edit_mode.py::TestGuards::test_pointer_up_index_out_of_range_no_change": 0.2011388000100851, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_fig_annotation_rejects_bad_kind": 0.18981299991719425, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_add_update_remove_fig_annotation_round_trip": 0.20252360007725656, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_applies_hspace_wspace": 0.20526980003342032, + "spyde/tests/migrated/test_report_edit_mode.py::TestLayoutAndFigureAnnotationActions::test_set_layout_clamps_to_unit_range": 0.21954520011786371, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_color_update_no_rebuild": 0.24032410013023764, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_edit_mode_text_update_no_rebuild": 0.21741979999933392, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_kind_change_rebuilds_even_in_edit_mode": 0.2353188000852242, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelAnnotationInPlaceUpdate::test_non_edit_mode_update_rebuilds": 0.21633190009742975, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_figure_background_deselects": 0.23336680000647902, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_panel_pointer_down_selects_and_outlines": 0.20807770011015236, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_repfig_select_panel_action": 0.20741179992910475, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_select_unknown_panel_is_figure_level": 0.21454620000440627, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSelection::test_selection_survives_rebuild": 0.22814699995797127, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_exchanges_grid_pos_and_rebuilds": 0.27361129980999976, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_same_panel_is_noop": 0.2636464999523014, + "spyde/tests/migrated/test_report_edit_mode.py::TestPanelSwap::test_swap_unknown_dispatch_id_is_noop": 0.2771745000500232, + "spyde/tests/migrated/test_report_edit_mode.py::TestRectArrowUncalibratedRoundTrip::test_rect_center_topleft_identity": 0.21350920002441853, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_arrow_tail_reshape_keeps_head_fixed": 0.21982489991933107, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_circle_radius_resize_persists_data_radius": 0.2383110000519082, + "spyde/tests/migrated/test_report_edit_mode.py::TestResizePersistence::test_rect_corner_resize_persists_center_and_size": 0.220257299952209, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_dispatch_panel_id_resolves_to_spec_panel": 0.20669110002927482, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_event_style_target_aliases": 0.20913240010850132, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_fallback_persists_when_cell_not_live": 0.20189249992836267, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_size_errors_and_leaves_spec_untouched": 0.20273090002592653, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_invalid_target_errors_and_leaves_spec_untouched": 0.19172219990286976, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_live_push_no_rebuild": 0.22437310009263456, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_size_is_clamped": 0.2025005999021232, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_round_trip_and_omitted_when_unset": 0.0009541000472381711, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_spec_yaml_round_trip": 0.003331500105559826, + "spyde/tests/migrated/test_report_edit_mode.py::TestTextSizes::test_verb_persists_on_spec_and_to_dict": 0.2036282999906689, + "spyde/tests/migrated/test_report_edit_mode.py::TestUncalibratedIdentity::test_drag_persists_pixel_values_identically": 0.21172450005542487, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_echoes_token_verbatim": 0.20265770016703755, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_html_export_omits_token_when_absent": 0.1990147999022156, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_echoes_token_verbatim": 0.207650100113824, + "spyde/tests/migrated/test_report_export.py::TestExportToken::test_markdown_export_omits_token_when_absent": 0.2082892000908032, + "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_has_sandboxed_iframes_no_bin": 0.2685978999361396, + "spyde/tests/migrated/test_report_export.py::TestInteractiveExport::test_interactive_offline_falls_back_to_img": 0.2363160999957472, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_folder_matches_zip_serialization": 0.23713630007114261, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_reexport_over_prior_export_ok": 0.21750000002793968, + "spyde/tests/migrated/test_report_export.py::TestMarkdownFolderExport::test_refuses_non_empty_foreign_dir": 0.21106510004028678, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_resolvable_rebuilds_live": 0.19663610006682575, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_figure_unresolvable_is_offline_with_png": 0.008066400070674717, + "spyde/tests/migrated/test_report_export.py::TestPasteCell::test_paste_markdown_cell": 0.008848899975419044, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_html_has_title_imgs_captions": 0.23658999998588115, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_no_open_report_errors": 0.008364400011487305, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_skips_placeholder": 0.190870399819687, + "spyde/tests/migrated/test_report_export.py::TestStaticExport::test_static_temp_writes_unique_tempfile": 0.20616499986499548, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_one_panel_updates_only_that_panel": 0.28703590005170554, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_cell_id_is_noop": 0.008592199999839067, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unknown_panel_id_is_noop": 0.18886880006175488, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_refresh_unresolvable_source_keeps_old_snapshot": 0.1971781001193449, + "spyde/tests/migrated/test_report_handlers.py::TestPanelRefresh::test_whole_figure_refresh_still_refreshes_every_panel": 0.26237859984394163, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_a_slides_only_cell_really_does_end_the_slide": 0.008572600083425641, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_cell_lazily_opens_report": 0.008397999918088317, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_add_markdown_cell": 0.007580999983474612, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_close_emits_closed_state": 0.007769900024868548, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_deleting_a_slide_head_keeps_the_slide": 0.007557200035080314, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_move_cell": 0.008428999921306968, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_clears_the_undo_stack": 0.007907000021077693, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_emits_open_state": 0.007606299943290651, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_new_template_flag": 0.00844830006826669, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_remove_cell": 0.008490799809806049, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_state_advertises_what_undo_would_do": 0.00868090009316802, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_next_slides_head_is_not_absorbed": 0.007658499991521239, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_the_slide_keeps_its_style_and_notes": 0.00960560014937073, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_does_not_split_the_slide_in_two": 0.007754800142720342, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_is_bounded": 0.007748599979095161, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_puts_the_cell_back_where_it_was": 0.008427900029346347, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_restores_a_deleted_cell": 0.008071200107224286, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_undo_with_an_empty_stack_is_harmless": 0.008172000059857965, + "spyde/tests/migrated/test_report_handlers.py::TestReportDocument::test_update_cell": 0.008017299929633737, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_bad_source_errors": 0.009159100009128451, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_fills_placeholder_in_place": 0.19044699985533953, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_add_figure_snapshots_and_emits_report_figure": 0.18845240003429353, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_refresh_figure_reemits": 0.213098100037314, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_caption": 0.19798919989261776, + "spyde/tests/migrated/test_report_handlers.py::TestReportFigures::test_set_title": 0.009947200072929263, + "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_open_offline_when_source_gone_includes_png": 0.2249903999036178, + "spyde/tests/migrated/test_report_handlers.py::TestReportOpenRebind::test_save_then_open_rebinds_live": 0.2519257999956608, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_assemble_assets_empty_harvest_uses_baked_fallback": 0.18328290001954883, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_empty_harvested_png_still_writes_baked_asset": 0.23744049994274974, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_figure_with_no_pixels_is_recorded_as_dropped": 0.18404760002158582, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_finish_save_warns_on_dropped_figure": 0.20558379997964948, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_remembers_path": 0.18257929990068078, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_save_with_no_renderer_reply_bakes_png": 0.22433759993873537, + "spyde/tests/migrated/test_report_handlers.py::TestReportSave::test_snapshots_completes_pending_save": 0.2523273000260815, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_build_figure_window_early_return_tears_down_stale": 0.19010729994624853, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_tears_down_controllers": 0.18910509999841452, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_close_when_never_opened": 0.007998399902135134, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_add_figure_two_cells": 0.20745330001227558, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_double_new_is_idempotent": 0.008495899965055287, + "spyde/tests/migrated/test_report_handlers.py::TestReportTeardown::test_remove_figure_cell_tears_down_its_window": 0.19702750002034009, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_accepts_bare_base64": 0.007872699992731214, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_at_index": 0.007896199938841164, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_creates_cell_and_emits_data_url": 0.01796590001322329, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_gif_ext_and_mime": 0.0076775000197812915, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_jpeg_normalises_to_jpg": 0.007702200091443956, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_no_data_errors": 0.00801979994866997, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_add_image_cell_unknown_ext_falls_back_to_png": 0.008273500017821789, + "spyde/tests/migrated/test_report_image_cell.py::TestAddImageCell::test_size_cap_rejects_oversized_image": 0.007621900062076747, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_remove_image_cell_clears_held_bytes": 0.008207900100387633, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_set_caption_edits_image_caption": 0.007321800105273724, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCaption::test_update_cell_edits_image_caption": 0.008260299917310476, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_double_round_trip_stable": 0.002405200037173927, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_and_figure_interleaved_distinguished": 0.0020375000312924385, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_round_trips_through_md": 0.002191699924878776, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_image_cell_serializes_with_ext_no_yaml": 0.0015676000621169806, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_nonpng_image_ref_parses_as_image_cell": 0.0013907999964430928, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellSerialization::test_png_ref_defaults_to_figure_in_parse": 0.00126369995996356, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_end_to_end_add_save_reopen_via_handlers": 0.02545440010726452, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_figure_png_with_yaml_stays_figure": 0.024081100127659738, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_png_image_without_yaml_promoted_to_image_cell": 0.019873400102369487, + "spyde/tests/migrated/test_report_image_cell.py::TestImageCellZip::test_save_and_reopen_restores_image_bytes": 0.032975499983876944, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_gif_export_uses_gif_mime": 0.05046319996472448, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_slides_export_inlines_image_data_url": 0.059141699923202395, + "spyde/tests/migrated/test_report_image_cell.py::TestImageExport::test_static_export_inlines_image_data_url": 0.02943039999809116, + "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell": 0.009888100088573992, + "spyde/tests/migrated/test_report_image_cell.py::TestImagePaste::test_paste_image_cell_missing_bytes_errors": 0.008918399922549725, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_absent_leaves_unchanged": 0.19933590001892298, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_capped_at_120_chars": 0.19338819989934564, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_label_empty_string_clears": 0.2041983000235632, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_layerspec_emits_styling_only_when_set": 0.0012335999635979533, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_linewidth_clamped": 0.2138863999862224, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_set_layer_persists_and_rebuilds": 0.2013050999958068, + "spyde/tests/migrated/test_report_line_panels.py::TestLayerStyling::test_yaml_round_trip_live_cell": 0.20268810004927218, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_build_figure_window_creates_plot1d": 0.18225929990876466, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_length_mismatch_falls_back_to_index_axis": 0.19167050009127706, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_styling_reaches_live_state": 0.19714389985892922, + "spyde/tests/migrated/test_report_line_panels.py::TestLineRender::test_text_sizes_apply_to_line_panel": 0.1858213999075815, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_axes_carries_x_axis_and_units": 0.1893356000073254, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_bad_current_data_returns_none": 0.16666109999641776, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_base_layer_styling_captured_from_live_plot1d": 0.17960899998433888, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_no_scalebar_or_colorbar_on_line_panel": 0.1883712998824194, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_map_holds_1d_array": 0.1872152000432834, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_produces_line_panel": 0.18328860017936677, + "spyde/tests/migrated/test_report_line_panels.py::TestLineSnapshot::test_snapshot_tolerates_missing_plot1d_state": 0.19339089991990477, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_refresh_panel_resnapshots_curve": 0.20725500001572073, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_repfig_refresh_panel_handler_no_error": 0.20142139995004982, + "spyde/tests/migrated/test_report_line_panels.py::TestRefresh::test_report_refresh_figure_no_error": 0.19196710002142936, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_annotation_refused": 0.17727999994531274, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_callout_refused": 0.18683709995821118, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_time_callouts_refused": 0.19860969996079803, + "spyde/tests/migrated/test_report_line_panels.py::TestRefusals::test_add_zoom_callout_refused": 0.21826779993716627, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_auto_clim_when_none": 0.001907799975015223, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_downsamples_huge_frame": 0.45984579995274544, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_returns_decodable_png": 0.0037161000072956085, + "spyde/tests/migrated/test_report_model.py::TestBakeFallbackPng::test_rgb_passthrough": 0.0014245999045670033, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_absent_key_yields_empty": 0.0008451001485809684, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_default_empty": 0.0008848001016303897, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_yaml_round_trip": 0.011682200245559216, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_figure_annotations_zip_round_trip": 0.035236299969255924, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_primary_layer_helper": 0.000897000078111887, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_has_no_python_object_tags": 0.0032731001265347004, + "spyde/tests/migrated/test_report_model.py::TestFigureSpecYaml::test_yaml_round_trip": 0.0076497000409290195, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_match_and_mismatch": 0.004743400029838085, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_fingerprint_missing_file": 0.0008884001290425658, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_dict_round_trip": 0.0008472999325022101, + "spyde/tests/migrated/test_report_model.py::TestFingerprint::test_signalref_resolve_none_session": 0.000832999823614955, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_bad_scalar_in_layer_records_error": 0.044359899940900505, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_malformed_spec_yaml_records_error_not_raises": 0.04640950006432831, + "spyde/tests/migrated/test_report_model.py::TestMalformedSpecYaml::test_spec_error_is_not_persisted": 0.004722500103525817, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_basic_markdown_and_figure": 0.0051614000694826245, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_code_fence_with_figure_lookalike_not_parsed": 0.0026080000679939985, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_double_round_trip_stable": 0.0030944000463932753, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_round_trips_stable": 0.003080699942074716, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_backtick_fence_with_inner_triple_fence": 0.0022909000981599092, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_four_tilde_fence_with_inner_triple_tilde": 0.0025330999633297324, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_front_matter_fields": 0.0024843999417498708, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_inline_image_is_not_a_figure_cell": 0.0025803999742493033, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_interleaved_cells_order_preserved": 0.00263109989464283, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_non_spyde_html_comment_survives": 0.0026577000971883535, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_placeholder_parsing_with_and_without_caption": 0.002515199827030301, + "spyde/tests/migrated/test_report_model.py::TestMarkdownRoundTrip::test_tilde_fence_lookalike_not_parsed": 0.002547200070694089, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_different_shape_rebinds_correct": 0.000924800056964159, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_same_title_same_shape_is_ambiguous_offline": 0.0008663000771775842, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_shape_serialized_and_tolerant_of_absence": 0.0008442000253126025, + "spyde/tests/migrated/test_report_model.py::TestRebindShape::test_title_match_no_shape_still_binds": 0.0008536000968888402, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_no_partial_file_on_failure": 0.007456899853423238, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_atomic_write_overwrites_existing": 0.02753690001554787, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_no_json_anywhere_in_container": 0.02014880010392517, + "spyde/tests/migrated/test_report_model.py::TestZipContainer::test_write_read_round_trip": 0.04138889990281314, + "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_forward_drag": 0.19696750002913177, + "spyde/tests/migrated/test_report_move_cell.py::TestFigureCellMove::test_figure_cell_moves_and_keeps_snapshots": 0.19256430002860725, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_backward_drag_lands_before_target": 0.007408799952827394, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_drag_to_end_no_index": 0.007042500074021518, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_lands_before_target_not_after": 0.007949299993924797, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_forward_drag_onto_immediate_next_neighbor_is_noop": 0.007259400095790625, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_same_position_is_noop": 0.007401000126264989, + "spyde/tests/migrated/test_report_move_cell.py::TestReportMoveCellOffByOne::test_unknown_cell_id_is_noop": 0.007287599961273372, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_empty": 0.0008234998676925898, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_input_list_not_mutated_in_place": 0.0008281001355499029, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_first_slide_to_last": 0.0018038999987766147, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_middle_forward": 0.0008999999845400453, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_move_multicell_slide_block": 0.0014318000758066773, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_noop_same_index": 0.0008436000207439065, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_out_of_range_indices": 0.0008329000556841493, + "spyde/tests/migrated/test_report_move_slide.py::TestMoveSlideHelper::test_three_slides_move_last_to_first": 0.0018904999596998096, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_multicell_slides_via_verb": 0.007786200032569468, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_emits_state_and_marks_dirty": 0.006850400124676526, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_missing_indices_noop": 0.007484600180760026, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_out_of_range_noop": 0.00807879981584847, + "spyde/tests/migrated/test_report_move_slide.py::TestReportMoveSlideVerb::test_move_slide_three_to_one": 0.007557899923995137, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_clear_drops_entry": 1.1401236999081448, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 1.1262964999768883, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.6372694000601768, + "spyde/tests/migrated/test_report_orientation_embed.py::TestBuildCaching::test_swapped_result_identity_rebuilds": 1.1360407999018207, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_no_orientation_is_none": 0.000762500218115747, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_raw_om_through_the_signal_ref": 0.0008119000121951103, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_resolves_vector_om_too": 0.0009130000835284591, + "spyde/tests/migrated/test_report_orientation_embed.py::TestCellResolution::test_specless_cell_is_none": 0.000759500078856945, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_all_four_views_plus_the_map_are_built": 0.5654096001526341, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_density_images_are_png_urls_not_raw_bytes": 0.0007878999458625913, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.0008857999928295612, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_panels_are_in_axis_order": 0.5644124000100419, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExplorerHtml::test_selfcontained_page": 0.6243518999544904, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_default_and_viewer_embed": 1.0797324000159279, + "spyde/tests/migrated/test_report_orientation_embed.py::TestExportHonoursMode::test_image_mode_skips_the_viewer": 0.0008710999973118305, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cap_refuses_embed": 0.0008577000116929412, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_cloud_is_strided_not_truncated": 0.5658402000553906, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_payload_roundtrip": 0.5618888001190498, + "spyde/tests/migrated/test_report_orientation_embed.py::TestPackOrientation::test_rows_are_nav_positions": 0.02299620001576841, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_image_mode_keeps_the_snapshot": 0.7113079000264406, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_orientation_cell_emits_live_explorer": 0.8034381000325084, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSidebarExplorer::test_vectors_win_when_a_tree_carries_both": 0.7496578999562189, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_older_file_defaults_to_viewer": 0.0007142999675124884, + "spyde/tests/migrated/test_report_orientation_embed.py::TestSpecMode::test_yaml_roundtrip": 0.0007645000005140901, + "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_tint_reaches_layer_state": 0.017649700166657567, + "spyde/tests/migrated/test_report_overlay_tint.py::TestBackendRender::test_untinted_layer_renders_as_before": 0.01673920010216534, + "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_next_unused_skips_taken_color": 0.2461674000369385, + "spyde/tests/migrated/test_report_overlay_tint.py::TestComposeTintCycle::test_overlays_get_distinct_cycle_tints": 0.21796159993391484, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_html_structure": 0.2119715999579057, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_blender_none_without_tint": 0.22060709993820637, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_interactive_export_swaps_in_blender": 0.25482300005387515, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_report_state_pixel_free_with_tint": 0.20536719996016473, + "spyde/tests/migrated/test_report_overlay_tint.py::TestInteractiveExportBlender::test_untinted_cell_keeps_live_iframe": 0.2754938999423757, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_malformed_tint_ignored": 0.21820670005399734, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_set_and_clear_persist": 0.24331270006950945, + "spyde/tests/migrated/test_report_overlay_tint.py::TestSetLayerTint::test_tint_survives_alpha_edit": 0.23308940010610968, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_old_dict_without_tint_loads_none": 0.000620800070464611, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_emits_and_from_dict_reads": 0.0006526000797748566, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_to_dict_omits_absent_tint": 0.0006962999468669295, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_round_trip_carries_tint": 0.005429200013168156, + "spyde/tests/migrated/test_report_overlay_tint.py::TestTintSchema::test_yaml_without_tint_key_loads_none": 0.005893200053833425, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_add_cell_accepts_present_fields_inline": 0.008041199762374163, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_set_live_action_and_clear": 0.008160399971529841, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_explicit_value": 0.0077630000887438655, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_slide_break_toggles_and_emits": 0.008234899956732988, + "spyde/tests/migrated/test_report_present.py::TestPresentVerbs::test_toggle_unknown_cell_is_noop": 0.007043199962936342, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_live_action_is_none": 0.0019438000163063407, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_absent_slide_break_is_false_on_old_file": 0.0012205000966787338, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_both_markers_on_one_cell": 0.0025791999651119113, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_double_round_trip_stable_with_markers": 0.002762199961580336, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_live_action_round_trips": 0.0023357000900432467, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_round_trips": 0.0023236999986693263, + "spyde/tests/migrated/test_report_present.py::TestSlideMarkersRoundTrip::test_slide_break_survives_zip": 0.026344300131313503, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_empty_slide_dropped": 0.04065790004096925, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_multiple_cells_per_slide": 0.03631739993579686, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_no_open_report_errors": 0.00872519996482879, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_shell_and_one_slide_per_group": 0.04121410008519888, + "spyde/tests/migrated/test_report_present.py::TestSlidesExport::test_slides_export_with_figure": 0.2757882000878453, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_empty_doc_no_slides": 0.0008048000745475292, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_every_cell_lands_in_exactly_one_slide": 0.0009154999861493707, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_groups_by_slide_break": 0.0008804000681266189, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_leading_break_on_first_cell_is_noop": 0.0008606999181210995, + "spyde/tests/migrated/test_report_present.py::TestSlidesGrouping::test_no_breaks_single_slide": 0.0008415000047534704, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_assemble_assets_without_harvest_skips_gracefully": 0.21467730007134378, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_harvested_png_is_used_and_reused": 0.21627800003625453, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DAssets::test_primary_snapshot_never_returns_point_cloud": 0.21901899995282292, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_add_annotation_is_refused": 0.21493749995715916, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_compose_tile_is_refused_without_mutation": 0.21604439988732338, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DCompose::test_query_compose_offers_nothing": 0.20538980001583695, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_creates_scene3d_cell_with_scene_and_snapshots": 0.19861010008025914, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_3d_without_orientation_result_errors": 0.1670291000045836, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_drop_direction_follows_tree": 0.2141274999594316, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DDrop::test_report_state_stays_pixel_free": 0.22514639992732555, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_panel_refresh_recomputes_point_cloud": 0.26487199997063726, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DRefresh::test_whole_figure_refresh_keeps_cell_live": 0.24054329982027411, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_reopen_without_result_goes_offline_gracefully": 0.2612413000315428, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DReopen::test_save_reopen_rebinds_live": 0.2928727000253275, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_dict_roundtrip": 0.002120699966326356, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_scene_key_omitted_when_unset": 0.0009963999036699533, + "spyde/tests/migrated/test_report_scene3d.py::TestScene3DSpecRoundTrip::test_yaml_roundtrip": 0.011872899951413274, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_decode_tolerates_garbage": 0.0008895000210031867, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_empty_and_whitespace_encode_to_empty": 0.0008902000263333321, + "spyde/tests/migrated/test_report_slide_notes.py::TestEncodeDecodeNotes::test_roundtrip_multiline_markdown_unicode": 0.0009306001011282206, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_no_notes_no_attr": 0.04175449989270419, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_escaped_in_attr": 0.0427871000720188, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_not_rendered_as_visible_content": 0.06215840007644147, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesInvisibleInExport::test_notes_stashed_in_hidden_data_attr": 0.04221810004673898, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_absent_notes_default_on_old_file": 0.0012558000162243843, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_double_round_trip_stable": 0.0024842998245730996, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_coexist_with_all_markers": 0.0020790999988093972, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_on_slide_first_cell_only": 0.002117499941959977, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_round_trip_report_md": 0.0023360999766737223, + "spyde/tests/migrated/test_report_slide_notes.py::TestNotesRoundTrip::test_notes_survive_zip": 0.03440700005739927, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_add_cell_accepts_notes_inline": 0.008141799946315587, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_clear_notes": 0.014944100053980947, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_notes_applies_to_slide_first_cell": 0.008692500065080822, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_set_notes_emits": 0.008325700066052377, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_state_emits_notes_field": 0.00907899986486882, + "spyde/tests/migrated/test_report_slide_notes.py::TestSetSlideNotesVerb::test_unknown_cell_is_noop": 0.007458899985067546, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_meta_exposes_notes": 0.0008809000719338655, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_empty": 0.0008627999341115355, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_off_first_cell": 0.0008802000666037202, + "spyde/tests/migrated/test_report_slide_notes.py::TestSlideNotesAccessors::test_slide_notes_via_grouping": 0.0009169001132249832, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_absent_markers_default_on_old_file": 0.0028258999809622765, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_double_round_trip_stable": 0.003132399986498058, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_kind_and_style_and_break_on_one_cell": 0.005716999992728233, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_kind_round_trips": 0.004361200029961765, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_slide_style_round_trips": 0.004047499969601631, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_survives_zip": 0.03308089997153729, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleRoundTrip::test_unknown_values_normalize_to_default": 0.003586099948734045, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_add_cell_accepts_kind_style_inline": 0.008137900033034384, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_applies_to_slide_first_cell": 0.007557300035841763, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_kind_explicit": 0.007374299922958016, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_set_slide_style": 0.007341200020164251, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_toggle_slide_kind": 0.008924899972043931, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideKindStyleVerbs::test_unknown_cell_is_noop": 0.007604800048284233, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_defaults_for_plain_content_slide": 0.0008200000738725066, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_empty_slide": 0.0007912999717518687, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_reads_kind_style_off_first_cell": 0.0008309000404551625, + "spyde/tests/migrated/test_report_slide_style.py::TestSlideMeta::test_slides_meta_combines_with_grouping": 0.0008679999737069011, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_caption_renders_in_slides": 0.26059359998907894, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_default_slide_markup_unchanged": 0.05476179998368025, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_slide_style_preset_class": 0.04303180007264018, + "spyde/tests/migrated/test_report_slide_style.py::TestSlidesExportStyling::test_title_slide_marked_and_big_title_css": 0.04793700005393475, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_add_figure_placeholder": 0.007350499974563718, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_figure_placeholder_roundtrips": 0.03688419982790947, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_photo_split_is_not_figure_like": 0.000999900046736002, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_fills_figure_side": 0.23503080010414124, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_set_split_figure_non_split_is_noop": 0.20443110004998744, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_split_figure_side_is_refreshable": 0.2590126999421045, + "spyde/tests/migrated/test_report_split_cell.py::TestFigurePlaceholderSlide::test_update_cell_edits_split_text": 0.007658099988475442, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_slides_export_renders_split_block": 0.008029400021769106, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_split_layout_orders_columns": 0.007666799938306212, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_stacked_layout_export": 0.008435299969278276, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitExport::test_static_export_renders_split_block": 0.008315099985338748, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell": 0.008076599915511906, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_add_split_cell_default_layout": 0.007777700084261596, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout": 0.0078045998234301805, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_stacked": 0.00795780005864799, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitHandlers::test_set_split_layout_unknown_normalizes": 0.007289499859325588, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitManagerZip::test_save_reopen_photo_split": 0.024181899963878095, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_cleans_up_figure_window": 0.23641140013933182, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_non_split_is_noop": 0.008582100039348006, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_on_empty_split_still_converts": 0.008846799959428608, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_roundtrips_through_zip": 0.2580151000292972, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_side_converts_to_markdown": 0.23671850003302097, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_figure_then_edit_text_like_a_markdown_cell": 0.25021229998674244, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitRemoveFigure::test_remove_photo_side_converts_to_markdown": 0.00804059999063611, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_figure_side_round_trips": 0.002233200124464929, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_empty_split_does_not_swallow_following_cell": 0.002842899993993342, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_figure_side_round_trips": 0.002286599949002266, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_image_side_round_trips": 0.0040791000938043, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_plain_cells_not_mis_parsed_as_split": 0.0011085000587627292, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_amid_plain_cells": 0.002025499939918518, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_layout_normalizes": 0.0012205002130940557, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSerialization::test_split_text_with_image_ref_lookalike_stays_intact": 0.0018136999569833279, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_non_split_cells_are_full_rows": 0.0008187999483197927, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitSlideColumns::test_split_cell_is_own_cols_row": 0.000811200006864965, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_figure_side_zip": 0.020621399977244437, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_photo_side_zip": 0.016608500038273633, + "spyde/tests/migrated/test_report_split_cell.py::TestSplitZipRoundTrip::test_png_photo_side_zip": 0.014926100033335388, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_absent_gives_defaults": 0.000902900006622076, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_clamps_logo_height": 0.0008694999851286411, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_coerces_bools_and_ints": 0.0008843999821692705, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_drops_unknown_keys": 0.0008673998527228832, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_fills_missing_keys": 0.0008808999555185437, + "spyde/tests/migrated/test_report_theme.py::TestNormalizeTheme::test_long_text_is_capped_but_logo_is_not": 0.0008766999235376716, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_custom_theme_round_trips": 0.004877300118096173, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_pre_theme_document_loads_with_the_builtin_look": 0.0013998000649735332, + "spyde/tests/migrated/test_report_theme.py::TestSerialization::test_untouched_deck_writes_no_theme_front_matter": 0.0016256999224424362, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_handlers_error_cleanly_with_no_open_report": 0.007504599983803928, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_reset_returns_the_builtin_look_not_the_saved_default": 0.018861300079151988, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_default_seeds_the_next_new_deck": 0.008114000083878636, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_marks_dirty": 0.007273800089024007, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_set_theme_merges_rather_than_replaces": 0.007610199972987175, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_state_always_carries_a_full_theme": 0.007876399788074195, + "spyde/tests/migrated/test_report_theme.py::TestThemeHandlers::test_use_default_applies_the_saved_default": 0.00825870013795793, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_clear_drops_entry": 0.021729600033722818, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_esm_text_cached_module_level": 0.0016566000413149595, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_no_cache_key_never_memoizes": 0.018796900054439902, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_page_memoized_by_cell_and_identity": 0.020788000081665814, + "spyde/tests/migrated/test_report_vectors_embed.py::TestBuildCaching::test_swapped_vectors_identity_rebuilds": 0.019787600031122565, + "spyde/tests/migrated/test_report_vectors_embed.py::TestCellResolution::test_vectors_for_cell_via_signal_ref": 0.005283100064843893, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[image]": 0.20121859991922975, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_with_mode_stamps_spec[viewer]": 0.18709179991856217, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_drop_without_mode_asks_and_defers": 0.17925339995417744, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_plain_drop_is_unprompted": 0.19500639999751002, + "spyde/tests/migrated/test_report_vectors_embed.py::TestDropChoice::test_spec_yaml_roundtrip": 0.004565700073726475, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_over_cap_returns_none": 0.0027739000506699085, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerHtml::test_selfcontained_page": 0.014109499985352159, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_4d_page_has_neither": 0.021872499957680702, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_single_slice_stack_gets_no_stack_panel": 0.0062793000834062696, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_gets_three_panels": 0.009759900160133839, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_a_stack_page_carries_a_phone_layout_too": 0.01599530002567917, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_page_wires_the_stack_panel": 0.01579989993479103, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_phone_layout_drops_the_stack_panel": 0.006386300083249807, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_slider_is_the_fallback_when_the_panel_cannot_build": 0.010308800032362342, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExplorerStackPanel::test_the_stack_curve_is_vectors_per_slice": 0.0031003999756649137, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_default_and_viewer_embed": 0.039497399935498834, + "spyde/tests/migrated/test_report_vectors_embed.py::TestExportHonorsMode::test_image_mode_skips_viewer": 0.00393220002297312, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_4d_scan_is_unchanged": 0.0024044999154284596, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_stack_without_an_index_is_refused": 0.0016254999209195375, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_a_whole_slice_is_one_contiguous_range": 0.001646700082346797, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors5D::test_index_covers_every_stack_position": 0.008223399985581636, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_cap_refuses_embed": 0.0024436000967398286, + "spyde/tests/migrated/test_report_vectors_embed.py::TestPackVectors::test_payload_roundtrip": 0.0035084999399259686, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_default_mode_embeds_explorer": 0.18467480002436787, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_image_cell_keeps_snapshot": 0.19034430000465363, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_rebuild_reuses_memoized_page": 0.2094962999690324, + "spyde/tests/migrated/test_report_vectors_embed.py::TestSidebarExplorer::test_viewer_cell_emits_live_explorer": 0.18645970011129975, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_allows_a_present_package": 0.0010701001156121492, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_action_matches_plot_hides_a_missing_package": 0.002051500021480024, + "spyde/tests/migrated/test_requires_package_gate.py::TestFilterIntegration::test_gate_is_wired_into_both_filters": 0.0017956998199224472, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_every_declared_extra_exists_in_pyproject": 0.002131100045517087, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[atomap-atoms]": 0.0013271999778226018, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[exspy-eels]": 0.001355700078420341, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_maps_each_gated_package_to_its_extra[kikuchipy-ebsd]": 0.0013282999861985445, + "spyde/tests/migrated/test_requires_package_gate.py::TestInstallHint::test_unknown_package_falls_back_to_a_plain_pip_line": 0.0010306000476703048, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_a_missing_package": 0.0041510999435558915, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_detects_an_installed_package": 0.00200340012088418, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_does_not_import_the_package": 0.002136699971742928, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_result_is_cached": 0.0018796001095324755, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackageAvailable::test_unresolvable_package_is_absent_not_an_error": 0.0011795000173151493, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_list_requires_all_of_them": 0.0019982000812888145, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_no_declaration_is_always_allowed": 0.0010813000844791532, + "spyde/tests/migrated/test_requires_package_gate.py::TestPackagesPresent::test_single_name_as_a_string": 0.002034100121818483, + "spyde/tests/migrated/test_requires_package_gate.py::TestRealToolbarUnaffected::test_no_current_action_is_accidentally_gated": 0.0010371999815106392, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_2d_rectangle_axes_are_checked_independently": 0.0013356999261304736, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_clamp_rewriting_geometry_fires": 0.0013975000474601984, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_collapse_onto_one_position_fires": 0.0013491000281646848, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_moved_and_resized_in_one_event_fires": 0.001353600062429905, + "spyde/tests/migrated/test_roi_trace.py::TestFiresOnRealAnomalies::test_the_warning_carries_the_preceding_events": 0.001356900087557733, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_fast_flick_is_silent": 0.0015420999843627214, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_a_single_point_region_is_silent": 0.0012271000305190682, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_one_edge_is_silent": 0.0015898998826742172, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_dragging_the_lower_edge_is_silent": 0.001590800005942583, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_first_event_has_nothing_to_compare_against": 0.0012271000305190682, + "spyde/tests/migrated/test_roi_trace.py::TestQuietDuringNormalDragging::test_pure_translation_is_silent": 0.0017435001209378242, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_mismatched_axis_count_is_ignored_not_fatal": 0.001425200025551021, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[None]": 0.0010578997898846865, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad2]": 0.0010301999282091856, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[bad3]": 0.0010206002043560147, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_never_raises_on_junk[nonsense]": 0.001034799963235855, + "spyde/tests/migrated/test_roi_trace.py::TestRobustness::test_trace_all_env_logs_every_event": 0.0015900001162663102, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_programmatic_over_cap_set_does_fire": 0.22855450003407896, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_a_span_at_the_cap_does_not_rewrite_every_event": 0.24718290008604527, + "spyde/tests/migrated/test_roi_trace.py::TestWiredIntoTheSelectors::test_sliding_an_established_span_is_quiet": 0.25440850004088134, + "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_physical_units_reach_panel_state": 0.17540479998569936, + "spyde/tests/migrated/test_scale_bar.py::TestScaleBar::test_pixel_units_give_no_scale": 0.18240700010210276, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestComposite5DClose::test_closing_dp_removes_composite_and_cancels_inner_settles": 0.2735011999029666, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closed_selector_dropped_from_session_lookup_tables": 0.2149969000602141, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_emits_selector_removed": 0.22643339994829148, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_closing_signal_window_removes_selector_from_multiplot_manager": 0.24823060003109276, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_navigator_and_other_signal_window_survive": 0.21695559995714575, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_queued_update_for_closed_selector_does_not_raise": 0.22878880007192492, + "spyde/tests/migrated/test_selector_close_cleanup.py::TestSelectorCloseCleanup::test_second_selector_survives_closing_first_signal_window": 0.41280209994874895, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_a_write_through_the_composite_reaches_the_active_selector": 0.22600810008589178, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_1d_composite_shares_with_both_sub_selectors": 0.22060230001807213, + "spyde/tests/migrated/test_selector_mode.py::TestCompositeSharesChildren::test_the_three_views_are_one_dict": 0.24713349994271994, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_only_crosshair_visible_initially": 0.23262859997339547, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_selector_info_emitted": 0.2261840000282973, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_emits_updated_info": 0.22732409997843206, + "spyde/tests/migrated/test_selector_mode.py::TestSelectorMode::test_toggle_to_integrate_swaps_visibility": 0.23631040006875992, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_azimuth_preserved_low_kv": 0.001815799972973764, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_center_offset_applied": 0.0015631000278517604, + "spyde/tests/migrated/test_sem_geometry.py::TestCorrectVectors::test_tem_is_near_noop_in_shape": 0.0024054000386968255, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_none_when_no_pairs": 0.0014992998912930489, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_recovers_offset_center_no_direct_beam": 0.0027869000332430005, + "spyde/tests/migrated/test_sem_geometry.py::TestFriedelCenter::test_robust_to_unpaired_spots": 0.0024069000501185656, + "spyde/tests/migrated/test_sem_geometry.py::TestPrepareSemVectors::test_end_to_end_recovers_g": 0.0015443001175299287, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_exact_roundtrip": 0.0015507000498473644, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_linear_overestimates_at_high_angle": 0.0013258998515084386, + "spyde/tests/migrated/test_sem_geometry.py::TestRadiusToG::test_small_angle_linear_limit": 0.0015977999428287148, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[10.0-0.12204]": 0.0017785000381991267, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[200.0-0.02508]": 0.0021926999324932694, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[30.0-0.06979]": 0.001720499829389155, + "spyde/tests/migrated/test_sem_geometry.py::TestWavelength::test_known_wavelengths[5.0-0.17328]": 0.001773300115019083, + "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_roundtrip_after_write": 0.0009293999755755067, + "spyde/tests/migrated/test_shm_read_robust.py::TestReadSharedArrayRobust::test_unwritten_buffer_raises_clean_valueerror": 0.0008888000156730413, + "spyde/tests/migrated/test_shm_read_robust.py::test_future_from_signal_no_ambiguous_truth": 0.0008927001617848873, + "spyde/tests/migrated/test_shm_read_robust.py::test_worker_does_not_skip_cancelled_future_but_result_is_harmless": 0.0008931999327614903, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_load_emits_signal_type_info": 0.1890731998719275, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_empty_type_reverts_to_generic": 0.3803697000257671, + "spyde/tests/migrated/test_signal_type.py::TestSignalType::test_set_signal_type_recasts_and_reemits": 0.37646490009501576, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_movie_navigator_is_1d": 0.24289909994695336, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_shift_click_two_1d_navigators_builds_stacked_figure": 0.2721808998612687, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_single_chip_does_not_build_stacked": 0.25134910014458, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedBuild::test_stacked_cursor_starts_at_current_selector_index": 0.43020900001283735, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_mirrors_to_the_other_row": 0.4094326999038458, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedDrag::test_drag_row2_line_moves_real_selector_index": 1.7067203000187874, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_index_hook_is_installed_on_the_real_selector": 0.2807960999198258, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedProgrammaticSync::test_programmatic_step_syncs_every_row_line": 0.398341599968262, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_closing_the_window_detaches_the_hook": 0.253339400049299, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_rebuild_replaces_the_prior_cursor": 0.2878247000044212, + "spyde/tests/migrated/test_stacked_navigators.py::TestStackedTeardown::test_switching_back_to_single_navigator_tears_down": 0.26091950002592057, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_cif_reference_gives_absolute_strain": 0.1748587000183761, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_families_exclude_forbidden": 0.06731870002113283, + "spyde/tests/migrated/test_strain_mapping.py::TestCifReference::test_snap_corrects_magnitude_to_ideal": 0.07640039979014546, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_commit_makes_new_signal_tree": 0.1020340999821201, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_component_toggle_resolves_controller_via_dispatch_window_id": 0.02159709995612502, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_controller_cif_reference_then_region": 0.19556240004021674, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_excludes_zero_beam": 0.01812620006967336, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_selector_uses_distinct_color_and_suppresses_toolbar": 0.0037715999642387033, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_reference_window_gets_distinguishing_title": 0.0009564000647515059, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strain_run_emits_window_and_attaches_controller": 0.08413149998523295, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainAction::test_strict_mode_double_mount_builds_only_one_controller": 0.08175629994366318, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_build_strain_figure_map_and_ref": 0.01679720019455999, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainDisplay::test_each_component_builds": 0.04302300000563264, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_linear_gradient_field": 0.016418099985457957, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainField::test_principal_strain_axes": 0.0008911999175325036, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_recovers_known_gradient": 0.007036100025288761, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFieldVectorized::test_vectorized_matches_loop": 0.05812789988704026, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_asymmetric_detection_still_fits": 0.0018631001003086567, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_center_offset_does_not_leak_into_strain": 0.0027649999829009175, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_friedel_matches_minus_g": 0.0018672000151127577, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_pure_rotation_is_not_strain": 0.0018678001360967755, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_recovers_known_strain": 0.002207399928011, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainFit::test_too_few_matches_returns_none": 0.0009312999900430441, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_handler_listens_on_double_click": 0.0009491000091657043, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_hit_test_is_scale_independent": 0.0010691999923437834, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_click_toggles_selection_and_fires_callback": 0.0011989001650363207, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_off_reference_draws_displacement_arrows": 0.0011840000515803695, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_reference_pixel_starts_with_nothing_selected": 0.0010551998857408762, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carries_forward_when_reference_moves": 0.0014903999399393797, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_selection_carry_forward_drops_peak_outside_match_radius": 0.0011302001075819135, + "spyde/tests/migrated/test_strain_mapping.py::TestStrainSelectionOverlay::test_strain_run_without_vectors_errors": 0.000853199977427721, + "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_recompute_applies_via_dispatch_thread": 0.03401870001107454, + "spyde/tests/migrated/test_strain_threaded.py::TestStrainThreaded::test_superseded_recompute_is_dropped": 0.5522193998331204, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_done_callback_delivers_async": 0.011927100014872849, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_future_is_cancellable": 0.006922399974428117, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_reads_a_lazy_crop_through_same_path": 0.04477989999577403, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_returns_materialised_frame": 0.010649800067767501, + "spyde/tests/migrated/test_submit_graph.py::TestSubmitGraph::test_synchronous_scheduler_no_nested_pool": 0.022470399970188737, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_band_count_matches_cubic_families": 0.00596230011433363, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_different_orientation_gives_a_different_pattern": 0.12350029998924583, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_orientation_field_has_two_distinct_grains": 0.13826799986418337, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_patterns_are_not_mirror_symmetric": 0.014265100006014109, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_same_orientation_gives_the_same_pattern": 0.13852269994094968, + "spyde/tests/migrated/test_synthetic_data.py::TestEBSD::test_shape_and_dtype": 0.013307000044733286, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_families_overlap_as_intended": 0.0016199001111090183, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ground_truth_lines_readable": 0.00614720000885427, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_ka_kb_ratio_recoverable_for_an_isolated_family": 0.01290899992454797, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_lines_peak_at_their_real_energies": 0.009583199978806078, + "spyde/tests/migrated/test_synthetic_data.py::TestEDS::test_shape_and_calibration": 0.009740000125020742, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_concentration_maps_are_asymmetric_and_distinct": 0.020607000100426376, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edge_intensity_tracks_its_concentration_map": 0.010666800080798566, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_edges_step_up_at_their_onsets": 0.01326769997831434, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_ground_truth_is_plain_python": 0.01561180001590401, + "spyde/tests/migrated/test_synthetic_data.py::TestEELS::test_shape_and_calibration": 0.009511500014923513, + "spyde/tests/migrated/test_synthetic_data.py::TestNoOptionalExtrasRequired::test_generators_work_without_exspy_or_kikuchipy": 0.021027700044214725, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_ebsd]": 0.0688220999436453, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eds]": 0.057939799851737916, + "spyde/tests/migrated/test_synthetic_data.py::TestSessionLoaders::test_loader_creates_a_tree[load_test_data_eels]": 0.06891039980109781, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_fft_opens_output_window": 0.3804394999751821, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_line_profile_opens_output_window": 0.3931285999715328, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_unknown_action_reports_error": 0.35482330003287643, + "spyde/tests/migrated/test_template_actions.py::TestTemplateActions::test_virtual_imaging_opens_output_window": 0.3919863000046462, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_imports_and_shapes": 0.008913199999369681, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_commit_creates_tree": 0.03253710002172738, + "spyde/tests/migrated/test_template_skeletons.py::TestTemplateSkeletons::test_wizard_gen_guard_and_idempotent_remove": 0.0010350999655202031, + "spyde/tests/migrated/test_test_hold.py::TestActionWiring::test_the_release_action_is_registered_and_importable": 0.005086599965579808, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_EVERY_caller_parks_not_just_the_first": 0.41473970003426075, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_a_forgotten_release_cannot_hang_the_run": 0.3156424999469891, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_after_release_later_chunks_do_not_stutter": 0.00819909991696477, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_below_the_threshold_does_not_park": 0.0034188999561592937, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_parks_at_the_threshold_and_resumes_on_release": 0.40837940003257245, + "spyde/tests/migrated/test_test_hold.py::TestHolding::test_release_before_the_hold_is_reached": 0.007800100021995604, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_an_unnamed_point_is_not_held": 0.0035729999653995037, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_hold_point_returns_immediately": 0.003582300036214292, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_release_of_an_unconfigured_hold_is_false_not_an_error": 0.004349599941633642, + "spyde/tests/migrated/test_test_hold.py::TestInertInProduction::test_unset_means_not_armed": 0.0038557000225409865, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_a_bare_name_holds_at_once": 0.0035239000571891665, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_absolute_count": 0.0036422000266611576, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_fraction_of_total": 0.0036192998522892594, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_rubbish_is_ignored_not_raised": 0.003558700089342892, + "spyde/tests/migrated/test_test_hold.py::TestSpecParsing::test_several_points": 0.003458600025624037, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_burst_coalesces_while_dispatcher_is_busy": 0.11734710005111992, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_dispatcher_is_a_single_shared_lane": 0.0027190998662263155, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_min_throttle_interval_enforced": 0.001986999879591167, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_settle_timer_armed_on_move_and_clears": 0.17030719993636012, + "spyde/tests/migrated/test_throttle.py::TestThrottle::test_update_data_uses_dispatcher_not_debounce_timer": 0.0038855000166222453, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Arctan]": 0.014811099856160581, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Erf]": 0.017892700037918985, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Exponential]": 0.007865800056606531, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[GaussianHF]": 0.01894560013897717, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Gaussian]": 0.024061000091023743, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[HeavisideStep]": 0.0055671000154688954, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Logistic]": 0.025286599877290428, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Lorentzian]": 0.02478170010726899, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[Offset]": 0.0013700000708922744, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_gradient_is_finite_everywhere[PowerLaw]": 0.006254999898374081, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Arctan]": 0.05044669995550066, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Erf]": 0.02567439980339259, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Exponential]": 0.013349900022149086, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[GaussianHF]": 0.024767099879682064, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Gaussian]": 0.03407679998781532, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[HeavisideStep]": 0.008505800040438771, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Logistic]": 0.03469040000345558, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Lorentzian]": 0.03143830003682524, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[Offset]": 0.0025651000905781984, + "spyde/tests/migrated/test_torch_components.py::TestAnalyticGradient::test_matches_autodiff[PowerLaw]": 0.007604600046761334, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_batched_equals_looping_one_at_a_time": 0.007022600038908422, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_offset_broadcasts_over_the_signal_axis": 0.0012125999201089144, + "spyde/tests/migrated/test_torch_components.py::TestBatching::test_one_call_evaluates_every_position_independently": 0.0011322000063955784, + "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_inactive_component_contributes_nothing": 0.0010884000221267343, + "spyde/tests/migrated/test_torch_components.py::TestEvaluateSpec::test_sums_active_components_and_matches_hyperspy": 0.04022570000961423, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Arctan]": 0.01426480000372976, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Erf]": 0.020159499952569604, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Exponential]": 0.008234199951402843, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[GaussianHF]": 0.02053080010227859, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Gaussian]": 0.02892799989785999, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[HeavisideStep]": 0.006810399936512113, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Logistic]": 0.03125020011793822, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Lorentzian]": 0.025869199889712036, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Offset]": 0.0017932000337168574, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[Polynomial]": 0.008245799923315644, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_batched_rows_are_independent[PowerLaw]": 0.007397599867545068, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Arctan]": 0.019886299967765808, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Erf]": 0.021063599968329072, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Exponential]": 0.008804099983535707, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[GaussianHF]": 0.020249700057320297, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Gaussian]": 0.02660339989233762, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[HeavisideStep]": 0.00656629994045943, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Logistic]": 0.03245860000606626, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Lorentzian]": 0.04511509998701513, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Offset]": 0.0016096000326797366, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[Polynomial]": 0.008549400023184717, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_gradient_batches[PowerLaw]": 0.007512299809604883, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Arctan]": 0.01607519993558526, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Erf]": 0.019337499979883432, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Exponential]": 0.00808659999165684, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[GaussianHF]": 0.0210626000771299, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Gaussian]": 0.028378000133670866, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[HeavisideStep]": 0.006402700091712177, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Logistic]": 0.02914180012885481, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Lorentzian]": 0.02400360000319779, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Offset]": 0.0013303998857736588, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[Polynomial]": 0.0077737001702189445, + "spyde/tests/migrated/test_torch_components.py::TestEveryComponentBatches::test_value_batches[PowerLaw]": 0.006104099913500249, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Arctan]": 0.013403900200501084, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Erf]": 0.01724439999088645, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Exponential]": 0.00796380010433495, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[GaussianHF]": 0.03430889989249408, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Gaussian]": 0.03733930003363639, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[HeavisideStep]": 0.008191300090402365, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Logistic]": 0.030351500026881695, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Lorentzian]": 0.030088200117461383, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[Offset]": 0.0017626999178901315, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_is_differentiable[PowerLaw]": 0.0071153000462800264, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Arctan]": 0.016016499954275787, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Erf]": 0.018543199985288084, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Exponential]": 0.007623500074259937, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[GaussianHF]": 0.019735499983653426, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Gaussian]": 0.028182900045067072, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[HeavisideStep]": 0.0046492001274600625, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Logistic]": 0.0266529000364244, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Lorentzian]": 0.02427749999333173, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[Offset]": 0.0011873000767081976, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_linear_flags_match_hyperspy[PowerLaw]": 0.006596299936063588, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Arctan]": 0.026236600009724498, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Erf]": 0.026295099989511073, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Exponential]": 0.010167400003410876, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[GaussianHF]": 0.028491599950939417, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Gaussian]": 0.04882960009854287, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[HeavisideStep]": 0.05340300011448562, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Logistic]": 0.16698669991455972, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Lorentzian]": 0.030747300130315125, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[Offset]": 0.001310999970883131, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_parameter_order_matches_hyperspy[PowerLaw]": 0.005352200008928776, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Arctan]": 0.03544409992173314, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Erf]": 0.03790830017533153, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Exponential]": 0.016202700091525912, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[GaussianHF]": 0.03591549990233034, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Gaussian]": 0.05260880012065172, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[HeavisideStep]": 0.01111800002399832, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Logistic]": 0.05204990005586296, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Lorentzian]": 0.05370179994497448, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[Offset]": 0.0020181998843327165, + "spyde/tests/migrated/test_torch_components.py::TestParity::test_values_match_hyperspy[PowerLaw]": 0.010039499960839748, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[1]": 0.005861699930392206, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[2]": 0.007533099967986345, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_matches_hyperspy_at_each_order[3]": 0.01297160005196929, + "spyde/tests/migrated/test_torch_components.py::TestPolynomial::test_needs_an_explicit_order": 0.0009599000914022326, + "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_no_nan_gradient_from_the_dead_branch": 0.002032600110396743, + "spyde/tests/migrated/test_torch_components.py::TestPowerLawEdgeCases::test_zero_below_the_cutoff": 0.006118300021626055, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_inactive_unsupported_component_does_not_block": 0.0007300999714061618, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_false_rather_than_dropping_a_component": 0.0007455000886693597, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_supports_reports_true_for_a_portable_model": 0.0008240999886766076, + "spyde/tests/migrated/test_torch_components.py::TestRegistry::test_unknown_component_names_what_is_available": 0.0008257001172751188, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_columns_follow_the_packed_order": 0.0017463000258430839, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_evaluate_with_grad_matches_autodiff": 0.007739500026218593, + "spyde/tests/migrated/test_torch_components.py::TestWholeModelGradient::test_reports_analytic_availability": 0.0007165999850258231, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_close_all_tears_down_tutorial_trees": 2.04142250015866, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_unknown_name_emits_error": 0.017133999965153635, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_dispatch_works_under_simulated_packaged_env": 0.3818855000426993, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_repeat_load_is_idempotent": 2.2815839000977576, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_session_begin_is_not_test_gated": 0.001083599985577166, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadDispatch::test_tutorial_load_not_in_test_actions_gate": 0.0010276000248268247, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_all_loaders_present_in_map": 0.0017380001954734325, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_find_vectors_shape": 0.247678600018844, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_movie_shape_is_small_and_insitu": 0.264025199925527, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_multiphase_shape": 0.29998949996661395, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_navigation_shape": 1.5060835999902338, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_orientation_shape": 0.26478370011318475, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_spectroscopy_shape": 0.43365639995317906, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialLoadersDirect::test_strain_shape_is_bounded": 1.033326999982819, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_close_all_ends_the_session": 0.3335211998783052, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_derived_result_windows_are_closed_too": 1.7638657999923453, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_only_active_session_records": 0.3468030000803992, + "spyde/tests/migrated/test_tutorial_data.py::TestTutorialSessionTeardown::test_user_file_backed_tree_is_never_closed": 1.9756435999879614, + "spyde/tests/migrated/test_units.py::test_no_dollar_or_braces_remain": 0.0017670999513939023, + "spyde/tests/migrated/test_units.py::test_pyxem_latex_angstrom_macro_becomes_unicode": 0.001797199947759509, + "spyde/tests/migrated/test_units.py::test_reciprocal_angstrom_latex_becomes_unicode": 0.0018834000220522285, + "spyde/tests/migrated/test_units.py::test_reciprocal_nm_and_plain_units": 0.0017865999834612012, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_emits_gpu_status_result": 0.007526500034146011, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_reports_no_gpu_without_torch": 0.007444599876180291, + "spyde/tests/migrated/test_update_gpu_status.py::TestGpuStatusAction::test_staged_handler_registered": 0.0007869999390095472, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_defaults_to_stable": 0.009163199923932552, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_dispatch_action_routes_to_settings": 0.007351499982178211, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_restores_persisted_channel_on_restart": 0.02319300000090152, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_persists": 0.02385919983498752, + "spyde/tests/migrated/test_update_gpu_status.py::TestUpdateChannelSettings::test_set_update_channel_rejects_invalid": 0.008090100134722888, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_disk_centered_on_vector": 0.0023401000071316957, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_changes_with_nav_position": 0.002581499982625246, + "spyde/tests/migrated/test_vector_disks.py::TestDiskRendering::test_frame_disk_value_is_intensity": 0.0802962000016123, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_1x1_region_equals_render_frame": 0.001988900010474026, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_bounds_clamped_and_ordered": 0.0030645999358966947, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_full_region_sums_all_frames": 0.004805400036275387, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_no_full_dataset_compute": 0.0014898000517860055, + "spyde/tests/migrated/test_vector_disks.py::TestRenderRegion::test_two_position_region_equals_sum_of_frames": 0.0016052998835220933, + "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_intensity_weighted_matches_manual_sum": 0.0014974001096561551, + "spyde/tests/migrated/test_vector_disks.py::TestVectorVirtualImaging::test_roi_radius_excludes_far_vectors": 0.0009496000129729509, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_matches_serial": 2.4540816000662744, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_chunked_progress_and_stop": 1.4581539999926463, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_smoothed_strain_reduces_noise_keeps_edges": 0.03204559988807887, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_strain_component_maps": 0.0008961999556049705, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_to_orientation_map_and_ipf": 0.02213700022548437, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_tv_beats_raw_at_high_noise": 0.009554699994623661, + "spyde/tests/migrated/test_vector_orientation.py::TestBatchDriver::test_uniform_field_recovered": 0.6078418998513371, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_intensity_scale_invariant": 0.12685759994201362, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_clean_strain": 0.0496659999480471, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_recovers_strain_across_weightings": 0.2032103999517858, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_at_raw_count_scale": 0.06165549997240305, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_robust_to_missing_and_spurious": 0.07143100001849234, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_strain_respects_cap": 0.3222436000360176, + "spyde/tests/migrated/test_vector_orientation.py::TestFit::test_too_few_vectors_returns_none": 0.0013997999485582113, + "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_skewed_vectors_high_asymmetry": 0.0015795000363141298, + "spyde/tests/migrated/test_vector_orientation.py::TestFriedelQC::test_symmetric_strain_low_asymmetry": 0.0015735001070424914, + "spyde/tests/migrated/test_vector_orientation.py::TestIntegrationAg::test_recovers_orientation_and_strain": 14.22888629999943, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_identity": 0.0012188999680802226, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_rotation": 0.001133100246079266, + "spyde/tests/migrated/test_vector_orientation.py::TestPoseMath::test_project_translation": 0.0011167998891323805, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_clamps_excess_strain": 0.0011617999989539385, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_forbids_reflection": 0.0012342999689280987, + "spyde/tests/migrated/test_vector_orientation.py::TestStrainBound::test_within_bound_unchanged": 0.0012471999507397413, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_progress_and_shm_preview": 0.0017880999948829412, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_recovers_known_strain": 14.986060300143436, + "spyde/tests/migrated/test_vector_orientation_gpu.py::test_gpu_stop_flag_aborts": 0.0018126999493688345, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_fit_field_prefers_gpu_then_falls_back": 0.01992470002733171, + "spyde/tests/migrated/test_vector_orientation_om.py::TestVectorOrientationOM::test_generate_then_run": 11.517294500023127, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_pure_rotation_in_theta": 0.0037459000013768673, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_parked_in_A_is_recovered": 0.00792370003182441, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_rotation_split_between_theta_and_A_adds_up": 0.005295600043609738, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_strain_is_unchanged_by_the_split": 0.0017882001120597124, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestPoseInPlaneAngle::test_symmetric_stretch_does_not_tilt_the_angle": 0.0010716000106185675, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_full_template_beats_a_sparse_exactly_matching_decoy": 0.028442599927075207, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_picks_the_matching_geometry_over_a_different_shell": 0.004027300048619509, + "spyde/tests/migrated/test_vector_orientation_seed.py::TestSeedToleratesPartialDetection::test_recovers_the_in_plane_angle": 0.005612199893221259, + "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_attached_with_pixel_offsets": 1.775017699925229, + "spyde/tests/migrated/test_vector_overlay.py::TestVectorOverlay::test_overlay_updates_when_navigator_moves": 1.9533844998804852, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_crosshair_indices_render_single_frame": 0.0031892999541014433, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_differs_from_pointer": 0.002469100058078766, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_region_grid_indices_sum_frames": 0.006182099925354123, + "spyde/tests/migrated/test_vector_region_integrate.py::TestRegionIntegrateFn::test_single_cell_grid_equals_render_frame": 0.003059200127609074, + "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_add_vector_vi_computes_from_vectors": 1.5898151998408139, + "spyde/tests/migrated/test_vector_virtual_imaging.py::TestVectorVirtualImaging::test_count_vs_intensity_and_shape_change": 1.7827507000183687, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_none_for_4d": 0.08575620001647621, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_current_t_reads_source_index": 0.14935029996559024, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5D::test_reduce_returns_2d_current_slice_for_stack": 0.14166299998760223, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_count_weighting_differs_from_intensity": 0.14090119989123195, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_reduce_to_5d_pushes_and_returns_none": 0.14095199992880225, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_rectangle": 0.12374049983918667, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_array_returns_full_stack": 0.15213789988774806, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSeries::test_series_slice_matches_reduce_for_each_t": 0.13238029996864498, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_add_vvi_spawns_navigable_3d_tree": 0.5691389999119565, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVI5DSpawnTree::test_roi_move_recomputes_full_stack": 0.69525790004991, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_handles_reversed_corners": 0.08821080019697547, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_rect_image": 0.0836451998911798, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVICompute::test_roi_image_intensity_weighted": 0.07682650000788271, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_absent_on_raw_diffraction": 0.011940399999730289, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_excluded_on_vectors_image": 0.009641999960877001, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_dense_actions_present_on_raw_diffraction": 0.011296299984678626, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_hidden_until_vectors_attach": 0.012965200003236532, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_other_actions_unaffected": 0.010617799940519035, + "spyde/tests/migrated/test_vector_vvi_action.py::TestVectorVVIGating::test_present_on_vectors_image": 0.009309799992479384, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_4d_result_registers_no_hook": 0.001014700043015182, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_a_repeat_of_the_same_slice_does_not_repaint": 0.0011852000607177615, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_moving_time_repaints_the_count_map": 0.0013296999968588352, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_reattaching_does_not_double_paint": 0.0011784000089392066, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultDisplay::test_the_time_navigator_gets_per_slice_totals": 0.0011550000635907054, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_an_unpainted_stack_navigator_is_still_found": 0.08715159993153065, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_finalize_never_pushes_a_2d_map_onto_the_1d_navigator": 0.09101039997767657, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_render_fn_goes_to_the_dp_and_the_count_map_to_the_navigator": 0.08833970001433045, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_count_fn_returns_that_slices_count_map": 0.10098899994045496, + "spyde/tests/migrated/test_vectors_5d.py::TestFiveDResultWiringOnARealTree::test_the_intermediate_navigator_is_not_a_signal_plot": 0.08986629999708384, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_picks_current_slice_only": 0.0020654998952522874, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_at_nav_stale_lead_falls_back": 0.0018438998376950622, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_at_t_matches_series_and_no_crash": 0.002614299883134663, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_count_map_series_is_3d_per_slice": 0.0028485999209806323, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_kxy_at_nav_shape": 0.0023692999966442585, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_n_time_and_shapes": 0.002147100050933659, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_disk_is_3d": 0.0014343999791890383, + "spyde/tests/migrated/test_vectors_5d.py::TestVectors5D::test_virtual_image_series_rect_is_3d": 0.0012105999048799276, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_column_names_in_metadata": 0.004647600115276873, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_empty_vectors_roundtrip": 0.6481145001016557, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_non_vectors_signal_rejected": 0.008099300088360906, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_signal_type_tag": 0.008873499929904938, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_4d": 0.005940400063991547, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestDenseConversion::test_to_from_dense_5d": 0.006941600004211068, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_load_reconstructs_result_tree": 0.3709661002503708, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_result_root_is_placeholder_not_rendered": 0.37541940005030483, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestSessionRoundTrip::test_save_picks_dense_carrier": 0.3204615998547524, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_rendered_frame_after_reload": 0.2834702000254765, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_4d": 0.45823500002734363, + "spyde/tests/migrated/test_vectors_roundtrip.py::TestZspyRoundTrip::test_zspy_5d": 0.5106216000858694, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_contrast_from_full_res_not_overview": 0.4579216999700293, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_large_frame_auto_enables_tile_mode": 0.357024599914439, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_live_update_swaps_frame_keeps_view": 0.32557869993615896, + "spyde/tests/migrated/test_viewport_detail.py::TestSetDataDrivesTiling::test_small_frame_stays_untiled": 0.011764299939386547, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_figure_has_n_axes": 0.014018400106579065, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_no_data_returns_none": 0.0007048000115901232, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_build_tiled_preserves_window_order_not_click_order": 0.012101700063794851, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_register_views_rgb_and_scalar": 0.017003200016915798, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_emits_one_tiled_figure": 0.012455100077204406, + "spyde/tests/migrated/test_views.py::TestTiledViews::test_tile_views_skips_single_selection": 0.0007646000012755394, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_add_virtual_image_creates_colored_vi_and_emits_chip": 0.3849131998140365, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_colors_cycle_across_adds": 0.713712100056, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_remove_chip_closes_window_and_drops_it": 0.4055885999696329, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_type_change_rebuilds_the_roi_shape": 0.6470535999396816, + "spyde/tests/migrated/test_virtual_imaging.py::TestVirtualImagingSubToolbar::test_update_vi_applies_caret_params_live": 0.5288670001318678, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_returns_all_time_steps": 0.004808299941942096, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_at_t_filters_correctly": 0.0027620999608188868, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_kdtree_t_param": 0.01602769992314279, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_n_time": 0.0074312001233920455, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_per_frame_roi_performance": 1.770999800064601, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_matches_per_t": 0.011605699895881116, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_performance": 2.7093299000989646, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_series_shape": 0.008885199902579188, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_5d_virtual_image_t_param_isolates_frame": 0.007484299945645034, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_empty_buffer": 0.0008131001377478242, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_build_kdtree_sets_internal_tree": 0.002653400064446032, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_direct_roi_performance": 0.09633630001917481, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_build_performance": 0.09974610025528818, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_empty_buffer": 0.0008320001652464271, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_fallback_when_not_built": 0.00166229996830225, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_annulus": 0.00251590006519109, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_count_mode": 0.002067399909719825, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_large_roi": 0.0023641998413950205, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_matches_direct_small_roi": 0.0036893999204039574, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_no_hits_in_roi": 0.0012801999691873789, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_kdtree_query_performance": 0.11264200008008629, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_large_dataset_direct_roi_under_budget": 1.426878699916415, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_annulus_excludes_inner": 0.0015779000241309404, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_count_mode": 0.001521300058811903, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_empty_buffer_returns_zeros": 0.0017119002295657992, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_intensity_sum_matches_manual": 0.0024126999778673053, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_known_positions_exact": 0.001029500039294362, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_large_radius_covers_all_vectors": 0.0020512001356109977, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_non_square_nav": 0.001702000037766993, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_output_shape": 0.0037631000159308314, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_single_nav_position": 0.0009599000914022326, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_sum_matches_manual_count": 0.0021526999771595, + "spyde/tests/migrated/test_virtual_vector_imaging.py::test_roi_zero_radius_no_hits": 0.0025996000040322542, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_start_then_stop": 0.0020951000042259693, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_context_manager_emits_stop_on_exception": 0.0020663001341745257, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingLifecycleHelper::test_none_window_id_is_a_silent_noop": 0.0020201000152155757, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayErrorPath::test_failed_fill_still_emits_stop": 6.155348200118169, + "spyde/tests/migrated/test_window_computing_overlay.py::TestWindowComputingOverlayNavFill::test_start_then_stop_bracket_the_progressive_nav_fill": 0.6248456998728216, + "spyde/tests/migrated/test_wizard_double_fire.py::TestFindVectorsPreviewDoubleFire::test_strict_mode_leaves_exactly_one_live_preview": 0.5650181999662891, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_controllers_declare_parameters": 0.0006980999605730176, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_czb_defaults": 0.001779099926352501, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_fv_defaults_match_action": 0.0007174999918788671, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_om_defaults_match_action": 0.0007027999963611364, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_strain_components": 0.0013610001187771559, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_defaults": 0.001591299893334508, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaBackendLockstep::test_vom_fit_defaults": 0.0015826000599190593, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_every_wizard_key_has_a_schema": 0.0019520000787451863, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_schema_is_a_copy": 0.0017859999788925052, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaCompleteness::test_unknown_key_raises": 0.001815799972973764, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[czb]": 0.002114600036293268, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[fv]": 0.0022145999828353524, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[om]": 0.0021221000934019685, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[strain]": 0.0021171000553295016, + "spyde/tests/migrated/test_wizard_schemas.py::TestSchemaValidity::test_entries_well_formed[vom]": 0.002151499968022108, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_bare_future": 0.2147566000930965, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_skips_future_bearing_object_array": 0.2197860999731347, + "spyde/tests/migrated/test_zspy_load.py::TestNavigatorFutureGuard::test_set_array_still_paints_real_array": 0.220138999982737, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_missing_zspy_emits_error": 0.027140099904499948, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_open_zspy_folder_loads": 0.37667810008861125, + "spyde/tests/migrated/test_zspy_load.py::TestZspyOpen::test_zspy_is_self_describing": 0.0007122000679373741, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_dataset_size_walks_zspy_dir": 0.1565014001680538, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_missing_zspy_dir_is_not_supported": 0.0038777999579906464, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_regular_file_still_works": 0.003866399871185422, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_dir_is_supported_dataset": 0.24794160015881062, + "spyde/tests/migrated/test_zspy_load.py::TestZspyPathHelpers::test_zspy_in_supported_exts": 0.0006998999742791057, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_explicit_hspy_extension_kept": 0.23382489988580346, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_no_extension_defaults_to_zspy": 0.35328080016188323, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_resolves_active_window_when_no_plot": 0.3477762999245897, + "spyde/tests/migrated/test_zspy_load.py::TestZspySaveDefault::test_save_signal_writes_zspy_folder": 0.4972643000073731 } \ No newline at end of file diff --git a/spyde/tests/migrated/test_action_deselect.py b/spyde/tests/migrated/test_action_deselect.py index 5239ce57..19023dd5 100644 --- a/spyde/tests/migrated/test_action_deselect.py +++ b/spyde/tests/migrated/test_action_deselect.py @@ -6,6 +6,7 @@ from __future__ import annotations import time +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -22,7 +23,7 @@ def _run_action(session): src = _signal_plot(session) assert src is not None session._dispatch_toolbar_action(src, ACTION, {}) - time.sleep(0.4) + _settle(session) return src diff --git a/spyde/tests/migrated/test_action_dispatch_state.py b/spyde/tests/migrated/test_action_dispatch_state.py index 799c778c..b44dccd7 100644 --- a/spyde/tests/migrated/test_action_dispatch_state.py +++ b/spyde/tests/migrated/test_action_dispatch_state.py @@ -10,6 +10,7 @@ from __future__ import annotations import time +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -26,7 +27,7 @@ def test_generic_dispatch_stores_action_instance(self, stem_4d_dataset): plot = _signal_plot(session) session._dispatch_toolbar_action(plot, "FFT", {}) - time.sleep(0.3) + _settle(session) art = session._action_artifacts.get((plot.window_id, "FFT")) assert art is not None, "FFT artifacts not tracked" @@ -37,7 +38,7 @@ def test_update_vi_reaches_generic_action(self, stem_4d_dataset): session = stem_4d_dataset["window"] plot = _signal_plot(session) session._dispatch_toolbar_action(plot, "FFT", {}) - time.sleep(0.3) + _settle(session) art = session._action_artifacts.get((plot.window_id, "FFT")) assert art is not None diff --git a/spyde/tests/migrated/test_axes_edit.py b/spyde/tests/migrated/test_axes_edit.py index b20d80d3..3952d539 100644 --- a/spyde/tests/migrated/test_axes_edit.py +++ b/spyde/tests/migrated/test_axes_edit.py @@ -11,6 +11,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -27,7 +28,7 @@ def test_set_axis_writes_back_and_re_emits(self): s = hs.signals.Signal2D(np.zeros((4, 5, 24, 24), np.float32)) s.set_signal_type("electron_diffraction") session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -72,7 +73,7 @@ def test_scale_edit_preserves_origin_pixel(self): s.axes_manager._axes[3].scale = 0.1 s.axes_manager._axes[3].offset = -1.0 # origin pixel = 1.0/0.1 = 10 session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) axx = plot.signal_tree.root.axes_manager._axes[3] origin_px = -float(axx.offset) / float(axx.scale) diff --git a/spyde/tests/migrated/test_center_zero_beam.py b/spyde/tests/migrated/test_center_zero_beam.py index 4173b212..d48183e6 100644 --- a/spyde/tests/migrated/test_center_zero_beam.py +++ b/spyde/tests/migrated/test_center_zero_beam.py @@ -13,6 +13,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -55,7 +56,7 @@ def test_auto_centers_beam(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(beam=(18, 14))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) before = src.plot_state.current_signal @@ -85,7 +86,7 @@ def test_auto_region_shows_draggable_widget_and_run_uses_it(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(sig=(64, 64), beam=(18, 14))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -122,7 +123,7 @@ def test_region_widget_torn_down_on_close(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(sig=(32, 32))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -160,7 +161,7 @@ def test_activating_automatic_tab_shows_full_frame_box_immediately(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(sig=(48, 32))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -182,7 +183,7 @@ def test_region_drag_handler_runs_once_per_event(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(sig=(32, 32))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -222,7 +223,7 @@ def test_node_switch_tears_down_region_and_markers(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -249,7 +250,7 @@ def test_tree_close_tears_down_region_widgets(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree @@ -272,7 +273,7 @@ def test_manual_center_from_crosshair(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d(beam=(18, 14))) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree before = src.plot_state.current_signal diff --git a/spyde/tests/migrated/test_console_preview.py b/spyde/tests/migrated/test_console_preview.py index 09c2edd0..33e962dd 100644 --- a/spyde/tests/migrated/test_console_preview.py +++ b/spyde/tests/migrated/test_console_preview.py @@ -507,7 +507,9 @@ def test_stop_clears_nav_refresh(self, window): session.console.submit_preview("", pid + 999, True) n0 = _count_results(msgs, pid) session.console.notify_nav_changed() - time.sleep(0.6) + # Negative-evidence window (a rerun that must NOT happen has no event + # to poll for); 0.3 s is ~10x the preview thread's dispatch latency. + time.sleep(0.3) assert _count_results(msgs, pid) == n0, "nav move re-ran a STOPPED preview" # And the stop itself emitted nothing. assert not any(m.get("type") == "console_preview_result" @@ -522,7 +524,9 @@ def test_exec_clears_nav_refresh(self, window): assert _exec(session, msgs, "1 + 1") is not None n0 = _count_results(msgs, pid) session.console.notify_nav_changed() - time.sleep(0.6) + # Negative-evidence window (a rerun that must NOT happen has no event + # to poll for); 0.3 s is ~10x the preview thread's dispatch latency. + time.sleep(0.3) assert _count_results(msgs, pid) == n0, "nav move resurrected a pre-exec preview" def test_explicit_preview_not_nav_tracked(self, window): @@ -535,7 +539,9 @@ def test_explicit_preview_not_nav_tracked(self, window): pid = res["preview_id"] n0 = _count_results(msgs, pid) session.console.notify_nav_changed() - time.sleep(0.6) + # Negative-evidence window (a rerun that must NOT happen has no event + # to poll for); 0.3 s is ~10x the preview thread's dispatch latency. + time.sleep(0.3) assert _count_results(msgs, pid) == n0 def test_run_update_fires_hook_only_on_change(self, window, monkeypatch): diff --git a/spyde/tests/migrated/test_crop_action.py b/spyde/tests/migrated/test_crop_action.py index d121bb72..63f7eee5 100644 --- a/spyde/tests/migrated/test_crop_action.py +++ b/spyde/tests/migrated/test_crop_action.py @@ -16,6 +16,7 @@ from spyde.actions.base import ( CropAction, _crop_signal, crop_open, crop_close, crop_set_region, ) +from spyde.tests.migrated.conftest import _settle class TestCropSlicing: @@ -80,7 +81,7 @@ def test_run_adds_a_cropped_node(self, stem_4d_dataset): # x 2..14 (=12 cols), y 4..10 (=6 rows) → signal_shape (12, 6). act = CropAction.for_plot(plot, x0=2, x1=14, y0=4, y1=10) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None assert tuple(new.axes_manager.signal_shape) == (12, 6) @@ -96,7 +97,7 @@ def test_run_keeps_a_lazy_movie_lazy(self, movie_dataset): if not p.is_navigator and p.plot_state is not None) act = CropAction.for_plot(plot, x0=4, x1=20, y0=6, y1=18) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None assert new._lazy is True assert isinstance(new.data, da.Array), "cropped movie must stay lazy" @@ -148,7 +149,7 @@ def test_widget_drives_a_nonsquare_crop(self, stem_4d_dataset): # Run picks up the WIDGET's geometry — typed fields are stale/absent. act = CropAction.for_plot(plot) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None assert tuple(new.axes_manager.signal_shape) == (12, 6) @@ -170,7 +171,7 @@ def test_widget_partially_out_of_bounds_is_clamped(self, stem_4d_dataset): act = CropAction.for_plot(plot) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None # Clamped to the full valid frame (0..w, 0..h) rather than raising or diff --git a/spyde/tests/migrated/test_ebsd_indexing.py b/spyde/tests/migrated/test_ebsd_indexing.py index 7725fe2e..446bafa5 100644 --- a/spyde/tests/migrated/test_ebsd_indexing.py +++ b/spyde/tests/migrated/test_ebsd_indexing.py @@ -27,13 +27,36 @@ def scan(): return s, np.asarray(gt["euler"]), np.asarray(gt["grain2_mask"], bool) +@pytest.fixture(scope="module") +def dic_exact(scan): + """The exact-euler dictionary — pure data, was rebuilt by ~6 tests.""" + _s, euler, _ = scan + return simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + + +@pytest.fixture(scope="module") +def step_dict(): + """Memoised (euler, dictionary) per sampling step — pure data; the 10/12/ + 15 deg dictionaries were each built twice. Consumers are read-only + (remove_background / dictionary_index return new arrays).""" + cache: dict = {} + + def get(step_deg): + if step_deg not in cache: + eul = sample_orientations(step_deg=step_deg) + cache[step_deg] = (eul, simulate_patterns(eul, detector=(40, 40))) + return cache[step_deg] + + return get + + class TestRecoversKnownOrientations: - def test_exact_dictionary_recovers_every_orientation(self, scan): + def test_exact_dictionary_recovers_every_orientation(self, scan, dic_exact): """The strongest possible check: put the true orientations IN the dictionary and require indexing to find each one.""" s, euler, _ = scan flat = euler.reshape(-1, 3) - dic = simulate_patterns(flat, detector=(40, 40)) + dic = dic_exact r = dictionary_index(s.data, dic, device="cpu") got = np.asarray(dic)[r.best] # Several positions share an orientation (grain 2 is uniform), so @@ -42,7 +65,7 @@ def test_exact_dictionary_recovers_every_orientation(self, scan): assert np.allclose(got[i], dic[i], atol=1e-5), \ f"position {i} matched a different pattern" - def test_background_removal_is_what_makes_scores_near_one(self, scan): + def test_background_removal_is_what_makes_scores_near_one(self, scan, dic_exact): """NCC is invariant to gain and offset but NOT to a spatial GRADIENT. The detector background is present in every experimental pattern and in no simulated one, so it dilutes every score until it is removed — which @@ -50,7 +73,7 @@ def test_background_removal_is_what_makes_scores_near_one(self, scan): from spyde.ebsd import remove_background s, euler, _ = scan - dic = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + dic = dic_exact raw = dictionary_index(s.data, dic, device="cpu").best_score.min() # The SAME correction must be applied to BOTH sides. Removing the low # frequencies from the experimental patterns only would leave the @@ -64,7 +87,7 @@ def test_background_removal_is_what_makes_scores_near_one(self, scan): assert clean > raw, f"background removal did not help ({clean} vs {raw})" assert clean > 0.99, f"exact match still only scores {clean:.4f}" - def test_a_finer_dictionary_matches_better(self, scan): + def test_a_finer_dictionary_matches_better(self, scan, step_dict): """A realistic dictionary does NOT contain the exact answer — it lands on a nearby sample, and the finer the sampling the closer it lands. @@ -80,69 +103,53 @@ def test_a_finer_dictionary_matches_better(self, scan): exp = remove_background(s.data, device="cpu") scores = {} for step in (15.0, 10.0, 5.0): - dic = simulate_patterns(sample_orientations(step_deg=step), - detector=(40, 40)) + _eul, dic = step_dict(step) r = dictionary_index(exp, remove_background(dic, device="cpu"), device="cpu") scores[step] = float(r.best_score.mean()) assert scores[5.0] > scores[10.0] > scores[15.0], scores assert scores[5.0] > 0.9, f"even a 5 deg dictionary only got {scores}" - def test_the_two_grains_index_differently(self, scan): + def test_the_two_grains_index_differently(self, scan, step_dict): """If every position matched the same entry the map would be blank and - every score test above would still pass.""" + every score test above would still pass. Two properties of the one + result: the grain index-sets are disjoint, and grain 2 (a single + orientation) picks the SAME dictionary entry at every position.""" s, euler, mask = scan - dic_euler = sample_orientations(step_deg=10.0) - dic = simulate_patterns(dic_euler, detector=(40, 40)) + _eul, dic = step_dict(10.0) r = dictionary_index(s.data, dic, device="cpu") best = r.best.reshape(mask.shape) assert set(best[mask].tolist()).isdisjoint(set(best[~mask].tolist())) - - def test_grain_two_indexes_consistently(self, scan): - """Grain 2 is a single orientation, so every one of its positions must - pick the SAME dictionary entry.""" - s, euler, mask = scan - dic_euler = sample_orientations(step_deg=10.0) - dic = simulate_patterns(dic_euler, detector=(40, 40)) - r = dictionary_index(s.data, dic, device="cpu") - assert len(set(r.best.reshape(mask.shape)[mask].tolist())) == 1 + assert len(set(best[mask].tolist())) == 1 class TestTiling: """A running top-k merged across tiles must equal one un-tiled matmul.""" - def test_tiled_equals_untiled(self, scan): - s, euler, _ = scan - dic = simulate_patterns(sample_orientations(step_deg=12.0), - detector=(40, 40)) - whole = dictionary_index(s.data, dic, device="cpu", - tile_elements=1 << 30) - tiny = dictionary_index(s.data, dic, device="cpu", tile_elements=512) - np.testing.assert_array_equal(whole.best, tiny.best) - np.testing.assert_allclose(whole.best_score, tiny.best_score, rtol=1e-5) - - def test_top_k_survives_tiling(self, scan): - """The k-th best SCORE has to be right too, not just the winner — the - similarity map (#73) ranks the whole list. + def test_tiled_equals_untiled(self, scan, step_dict): + """One whole/tiny pair at keep=5 pins both properties: the winner is + identical, and the k-th best SCORE is right too — the similarity map + (#73) ranks the whole list. - Compared on scores, not indices: cubic symmetry means many dictionary - entries produce genuinely identical patterns, so which of a tied set is - returned depends on tile order and is not meaningful. Requiring equal - indices would be asserting an arbitrary tie-break. + The ranked list is compared on scores, not indices: cubic symmetry + means many dictionary entries produce genuinely identical patterns, so + which of a tied set is returned depends on tile order and is not + meaningful. Requiring equal indices there would be asserting an + arbitrary tie-break. """ s, euler, _ = scan - dic = simulate_patterns(sample_orientations(step_deg=12.0), - detector=(40, 40)) + _eul, dic = step_dict(12.0) whole = dictionary_index(s.data, dic, device="cpu", keep=5, tile_elements=1 << 30) tiny = dictionary_index(s.data, dic, device="cpu", keep=5, tile_elements=512) + np.testing.assert_array_equal(whole.best, tiny.best) + np.testing.assert_allclose(whole.best_score, tiny.best_score, rtol=1e-5) np.testing.assert_allclose(whole.scores, tiny.scores, atol=1e-5) - def test_scores_are_sorted_best_first(self, scan): + def test_scores_are_sorted_best_first(self, scan, step_dict): s, _, _ = scan - dic = simulate_patterns(sample_orientations(step_deg=15.0), - detector=(40, 40)) + _eul, dic = step_dict(15.0) r = dictionary_index(s.data, dic, device="cpu", keep=4) assert (np.diff(r.scores, axis=1) <= 1e-6).all() @@ -154,12 +161,12 @@ def test_keep_larger_than_the_dictionary_is_clamped(self, scan): class TestNormalisation: - def test_invariant_to_gain_and_offset(self, scan): + def test_invariant_to_gain_and_offset(self, scan, dic_exact): """NCC is scale- and offset-free, which is why a dictionary needs no background: a detector gradient or an exposure change must not alter the match.""" s, euler, _ = scan - dic = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + dic = dic_exact base = dictionary_index(s.data, dic, device="cpu") altered = dictionary_index(s.data.astype(np.float64) * 3.7 + 120.0, dic, device="cpu") @@ -167,12 +174,12 @@ def test_invariant_to_gain_and_offset(self, scan): np.testing.assert_allclose(base.best_score, altered.best_score, atol=1e-4) - def test_survives_a_detector_background(self, scan): + def test_survives_a_detector_background(self, scan, dic_exact): """The real reason the above matters — an un-corrected pattern still indexes, so background removal (#70) is an improvement not a prerequisite.""" s, euler, _ = scan - dic = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + dic = dic_exact with_bg = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40), background=True) r = dictionary_index(with_bg, dic, device="cpu") @@ -180,9 +187,9 @@ def test_survives_a_detector_background(self, scan): class TestShapesAndGuards: - def test_accepts_flattened_or_image_shaped_patterns(self, scan): + def test_accepts_flattened_or_image_shaped_patterns(self, scan, dic_exact): s, euler, _ = scan - dic = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + dic = dic_exact img = dictionary_index(s.data, dic, device="cpu") flat = dictionary_index(s.data.reshape(64, -1), dic.reshape(len(dic), -1), device="cpu") @@ -194,16 +201,15 @@ def test_mismatched_detector_size_is_caught(self, scan): with pytest.raises(ValueError, match="pixels"): dictionary_index(s.data, wrong, device="cpu") - def test_orientations_reshape_to_the_scan(self, scan): + def test_orientations_reshape_to_the_scan(self, scan, step_dict): s, euler, _ = scan - dic_euler = sample_orientations(step_deg=15.0) - dic = simulate_patterns(dic_euler, detector=(40, 40)) + dic_euler, dic = step_dict(15.0) r = dictionary_index(s.data, dic, device="cpu") assert r.orientations(dic_euler, (8, 8)).shape == (8, 8, 3) - def test_progress_reports_completion(self, scan): + def test_progress_reports_completion(self, scan, dic_exact): s, euler, _ = scan - dic = simulate_patterns(euler.reshape(-1, 3), detector=(40, 40)) + dic = dic_exact seen = [] dictionary_index(s.data, dic, device="cpu", tile_elements=2048, progress=lambda d, t: seen.append((d, t))) diff --git a/spyde/tests/migrated/test_ebsd_wizard.py b/spyde/tests/migrated/test_ebsd_wizard.py index 2072a806..df1148d0 100644 --- a/spyde/tests/migrated/test_ebsd_wizard.py +++ b/spyde/tests/migrated/test_ebsd_wizard.py @@ -22,6 +22,7 @@ DEFAULTS, EbsdWizard, ebsd_build_dictionary, ebsd_refine, ebsd_run, ) from spyde.data import ebsd_patterns, ground_truth +from spyde.tests.migrated.conftest import _settle @pytest.fixture(autouse=True) @@ -76,7 +77,7 @@ def ebsd_session(captured_messages, monkeypatch): session = Session(n_workers=1, threads_per_worker=1) s = ebsd_patterns(nav=(8, 8), detector=(40, 40)) session._add_signal(s, source_path=None) - time.sleep(0.8) # let the selector debounce timers fire + _settle(session) # let the selector debounce timers fire yield {"session": session, "signal": s, "truth": ground_truth(s), "messages": captured_messages, "trees": session.signal_trees, "plots": session._plots} @@ -112,15 +113,13 @@ def test_builds_a_wizard_with_a_resident_dictionary(self, ebsd_session): assert len(wiz.euler) == len(wiz.indexer) assert wiz.detector == (40, 40) - def test_adopts_the_projection_centre_the_data_records(self, ebsd_session): - """The synthetic scan stamps the PC it was rendered with. Without this - the first overlay is drawn with a guessed geometry and every line is - off, which reads as broken indexing.""" - _s, _p, _t, wiz = _build(ebsd_session) + # It adopts the projection centre the data records. The synthetic + # scan stamps the PC it was rendered with; without this the first + # overlay is drawn with a guessed geometry and every line is off, + # which reads as broken indexing. assert np.allclose(wiz.pc, ebsd_session["truth"]["pc"]) - def test_announces_itself_to_the_caret(self, ebsd_session): - _build(ebsd_session) + # And it announces itself to the caret. msgs = [m for m in ebsd_session["messages"] if m.get("type") == "ebsd_dictionary_ready"] assert msgs, "no ebsd_dictionary_ready — the caret stays locked" @@ -168,7 +167,7 @@ def test_rebuilding_replaces_the_previous_wizard(self, ebsd_session): class TestBandOverlay: - def test_draws_line_segments_for_the_matched_orientation(self, ebsd_session): + def test_draws_line_segments_and_streams_the_match(self, ebsd_session): _s, _p, _t, wiz = _build(ebsd_session) ov = wiz.overlay assert ov is not None, "no band overlay attached" @@ -178,9 +177,7 @@ def test_draws_line_segments_for_the_matched_orientation(self, ebsd_session): assert len(segs) > 0, "the matched orientation drew no bands" assert len(za) == 0, "zone axes are off by default" - def test_streams_the_match_to_the_caret(self, ebsd_session): - _s, _p, _t, wiz = _build(ebsd_session) - wiz.overlay._offsets_for(2, 3) + # The draw call above also streams the match to the caret. hits = [m for m in ebsd_session["messages"] if m.get("type") == "ebsd_match"] assert hits and hits[-1]["ok"] assert 0.0 <= hits[-1]["score"] <= 1.0 @@ -197,10 +194,9 @@ def test_a_different_position_gives_different_bands(self, ebsd_session): b, _ = wiz.overlay._offsets_for(int(ys2[0]), int(xs2[0])) assert a.shape != b.shape or not np.allclose(a, b) - def test_hiding_clears_both_marker_groups(self, ebsd_session): - """set_visible(False) pushes a bare array, not the (segments, points) - tuple the overlay normally renders — it has to survive that.""" - _s, _p, _t, wiz = _build(ebsd_session) + # Hiding clears both marker groups: set_visible(False) pushes a bare + # array, not the (segments, points) tuple the overlay normally + # renders — it has to survive that. wiz.overlay.set_visible(False) assert wiz.overlay._hidden wiz.overlay.set_visible(True) @@ -247,19 +243,16 @@ def test_indexes_the_scan_into_an_ipf_window(self, ebsd_session): assert rgb.shape == (8, 8, 3) and rgb.dtype == np.uint8 assert len(session.signal_trees) > before, "no result window opened" - def test_the_ipf_map_shows_the_two_grains(self, ebsd_session): - """The end-to-end check: the wedge grain must come out a different - colour from the drifting background grain. This is also the only test - that would notice the orientations being handed to orix transposed — - no, it would not; see test_ebsd_bands for that. It notices indexing - that lost the grain structure entirely.""" - session, plot, tree, _wiz = _build(ebsd_session) - ebsd_run(session, plot, {"keep": 4, "refine": False}) - assert _wait(lambda: getattr(tree, "orientation_map", None) is not None, - timeout=180) - rgb = tree.orientation_map.ipf_color_map("z").astype(float) + # And the IPF map shows the two grains. The end-to-end check: the + # wedge grain must come out a different colour from the drifting + # background grain. This is also the only test that would notice the + # orientations being handed to orix transposed — no, it would not; + # see test_ebsd_bands for that. It notices indexing that lost the + # grain structure entirely. + grain_rgb = rgb.astype(float) mask = np.asarray(ebsd_session["truth"]["grain2_mask"], bool) - assert np.linalg.norm(rgb[mask].mean(0) - rgb[~mask].mean(0)) > 20, \ + assert np.linalg.norm( + grain_rgb[mask].mean(0) - grain_rgb[~mask].mean(0)) > 20, \ "the two grains came out the same colour" def test_refuses_before_the_dictionary_is_built(self, ebsd_session): @@ -299,7 +292,7 @@ def lazy_session(self, captured_messages, monkeypatch): # it legitimately would, and the guard could not tell the difference). s.data = s.data.rechunk((2, 4, -1, -1)) session._add_signal(s, source_path=None) - time.sleep(0.8) + _settle(session) yield {"session": session, "signal": s, "messages": captured_messages, "trees": session.signal_trees, "plots": session._plots} session.shutdown() @@ -409,13 +402,19 @@ class _Wiz: def test_eager_data_still_gets_a_bounded_chunking(self): """An eager scan has no chunks of its own; it must still be given a nav chunking, sized by BYTES, so a bigger detector means fewer rows - rather than the same rows and more memory.""" + rather than the same rows and more memory. + + _nav_block_rows / _lazy_scan are pure bytes/shape math, so a 16x16 + nav grid proves the same three properties a 64x64 one did (which + cost ~9 s of pattern rendering). The budget shrinks with it so BOTH + row counts stay bytes-derived rather than ny-clamped: at 1 MiB the + 40x40 detector gives 10 rows and the 80x80 gives 2.""" from spyde.actions.ebsd_action import _lazy_scan, _nav_block_rows - small = ebsd_patterns(nav=(64, 64), detector=(40, 40)) - big = ebsd_patterns(nav=(64, 64), detector=(80, 80)) - budget = 4 << 20 + small = ebsd_patterns(nav=(16, 16), detector=(40, 40)) + big = ebsd_patterns(nav=(16, 16), detector=(80, 80)) + budget = 1 << 20 assert _nav_block_rows(big, budget) < _nav_block_rows(small, budget) - assert _nav_block_rows(small, 1 << 40) == 64 # never more than ny + assert _nav_block_rows(small, 1 << 40) == 16 # never more than ny scan = _lazy_scan(small) assert len(scan.chunks[2]) == 1 and len(scan.chunks[3]) == 1, \ "patterns must not be split across chunks" diff --git a/spyde/tests/migrated/test_find_vectors_port.py b/spyde/tests/migrated/test_find_vectors_port.py index 3959922b..d8818076 100644 --- a/spyde/tests/migrated/test_find_vectors_port.py +++ b/spyde/tests/migrated/test_find_vectors_port.py @@ -15,6 +15,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -50,7 +51,7 @@ def test_find_vectors_creates_attached_vectors_tree(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d(), source_path=None) - time.sleep(0.4) + _settle(session) src_plot = _signal_plot(session) assert src_plot is not None trees_before = len(session.signal_trees) @@ -74,31 +75,12 @@ def test_find_vectors_creates_attached_vectors_tree(self): cm = vecs.count_map() assert cm.shape == (4, 5) assert int(cm.sum()) > 0, "no vectors found on a clear bright-disk scan" - finally: - session.shutdown() - - def test_result_window_renders_vectors_and_overlays(self): - """Qt parity: once computed, the result window must (a) render the disk - frames when navigated — NOT the stale placeholder zeros — and (b) carry a - red found-vectors marker overlay tracking its count-map navigator.""" - from spyde.backend.session import Session - session = Session(n_workers=1, threads_per_worker=1) - try: - session._add_signal(_diffraction_4d(), source_path=None) - time.sleep(0.4) - src_plot = _signal_plot(session) - assert src_plot is not None - - session._dispatch_toolbar_action( - src_plot, "Find Diffraction Vectors", - {"sigma": 1.0, "kernel_radius": 5, "threshold": 0.4, - "min_distance": 3, "subpixel": True, "method": "nxcorr"}, - ) - assert _wait(lambda: getattr(session.signal_trees[-1], - "diffraction_vectors", None) is not None) - vtree = session.signal_trees[-1] - cm = vtree.diffraction_vectors.count_map() + # Qt parity, on the SAME computed result (this was a separate test + # re-running the byte-identical dispatch): once computed, the + # result window must (a) render the disk frames when navigated — + # NOT the stale placeholder zeros — and (b) carry a red + # found-vectors marker overlay tracking its count-map navigator. iy, ix = map(int, np.argwhere(cm > 0)[0]) # (a) The navigator now slices via an IN-PROCESS render_frame function @@ -135,11 +117,11 @@ def test_rejects_non_4d_dataset(self): try: s = hs.signals.Signal2D(np.random.RandomState(0).rand(16, 16).astype(np.float32)) session._add_signal(s, source_path=None) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) before = len(session.signal_trees) session._dispatch_toolbar_action(plot, "Find Diffraction Vectors", {}) - time.sleep(0.3) + _settle(session) # No vectors tree created for a 2-D image. assert len(session.signal_trees) == before finally: diff --git a/spyde/tests/migrated/test_insitu_signal_type.py b/spyde/tests/migrated/test_insitu_signal_type.py index 2adf1477..d22ea1da 100644 --- a/spyde/tests/migrated/test_insitu_signal_type.py +++ b/spyde/tests/migrated/test_insitu_signal_type.py @@ -21,6 +21,7 @@ from spyde.signals.insitu import InSitu, LazyInSitu from spyde.drawing.toolbars.plot_control_toolbar import get_toolbar_actions_for_plot +from spyde.tests.migrated.conftest import _settle class TestInSituSignalType: @@ -48,7 +49,7 @@ def test_movie_root_is_insitu(self, window): {"action": "load_test_data_movie", "payload": {"size": 64, "frames": 3}} ) import time - time.sleep(0.5) + _settle(session) assert len(session.signal_trees) == 1 tree = session.signal_trees[0] assert tree.root._signal_type == "insitu" @@ -95,7 +96,7 @@ def test_plain_1d_nav_signal_excludes_playback_buttons(self, window): assert s._signal_type != "insitu" session._add_signal(s, source_path=None) import time - time.sleep(0.5) + _settle(session) nav_plot = self._navigator_plot(session) assert nav_plot is not None, "1-D-nav fixture should have a navigator plot" names = get_toolbar_actions_for_plot(nav_plot.plot_state)[2] diff --git a/spyde/tests/migrated/test_ipf_3d.py b/spyde/tests/migrated/test_ipf_3d.py index 9ced18f4..471a45e3 100644 --- a/spyde/tests/migrated/test_ipf_3d.py +++ b/spyde/tests/migrated/test_ipf_3d.py @@ -48,11 +48,15 @@ def test_sphere_points_not_capped_at_20000(self): assert len(xyz) > 20_000 def test_sphere_points_still_caps_at_absurd_size(self): - # The 1,000,000-point safety ceiling still strides down an absurdly - # large input so it can't blow up memory/transport. - om = _al_orientation_map(ny=1200, nx=1200) # 1,440,000 pixels - xyz, rgb = om.ipf_sphere_points("z", max_points=1_000_000) - assert len(xyz) == len(rgb) <= 1_000_000 + # The max_points safety ceiling still strides down an over-large input + # so it can't blow up memory/transport. The cap branch is + # input-size-relative (input > max_points engages the stride-down), so + # a 40,000-pixel map against max_points=1000 exercises the same path + # a 1.44M-pixel map against the 1M default did — without 1.44M random + # quats through orix symmetry reduction (~9 s). + om = _al_orientation_map(ny=200, nx=200) # 40,000 pixels + xyz, rgb = om.ipf_sphere_points("z", max_points=1_000) + assert len(xyz) == len(rgb) <= 1_000 assert len(xyz) > 0 def test_ipf_key_overlay_is_an_rgba_image(self): diff --git a/spyde/tests/migrated/test_ipf_refine.py b/spyde/tests/migrated/test_ipf_refine.py index 540b8f79..83e071e8 100644 --- a/spyde/tests/migrated/test_ipf_refine.py +++ b/spyde/tests/migrated/test_ipf_refine.py @@ -5,6 +5,7 @@ import os import numpy as np +import pytest import hyperspy.api as hs CIF = os.path.join(os.path.dirname(__file__), "..", "Silver__0011135.cif") @@ -21,7 +22,14 @@ def _sig(nav=(3, 3), sig=(64, 64), scale=0.0134): return s -def _lib(): +@pytest.fixture(scope="module") +def lib(): + """One (signal, library, cache, n_templates) build for the whole module. + + The Silver .cif library + matching cache cost ~5 s and every consumer is + read-only: match_correlations takes rot_mask as an argument, + build_refine_figure/RefineIpfController build fresh figures per test, and + nothing mutates sim or the cache.""" from orix.crystal_map import Phase from spyde.actions.orientation_compute import ( generate_library_from_phases, build_matching_cache, template_tables, @@ -39,9 +47,9 @@ def _lib(): class TestIpfRefine: - def test_build_phase_ipf_geometry(self): + def test_build_phase_ipf_geometry(self, lib): from spyde.actions import ipf_refine - _s, sim, _c, n = _lib() + _s, sim, _c, n = lib infos = ipf_refine.build_phase_ipf(sim) assert len(infos) == 1 # single phase (Ag) info = infos[0] @@ -52,23 +60,23 @@ def test_build_phase_ipf_geometry(self): assert (info["xs"] >= info["mins"][0] - 1e-6).all() assert (info["xs"] <= info["maxs"][0] + 1e-6).all() - def test_match_correlations_full_length(self): + def test_match_correlations_full_length(self, lib): from spyde.actions import ipf_refine - s, sim, cache, n = _lib() + s, sim, cache, n = lib pat = np.asarray(s.data[1, 1], float) corr, best = ipf_refine.match_correlations(pat, sim, cache, gamma=0.5) assert corr.shape == (n,) assert corr.max() > 0 and np.isfinite(corr).all() assert int(best[0]) == int(np.argmax(corr)) # best row == argmax template - def test_build_uses_single_raster_not_polygons(self): + def test_build_uses_single_raster_not_polygons(self, lib): """The heatmap is ONE RGBA raster (not ~9k recoloured polygons), and the static markers (mask circles, outline, corner labels, best-match scatter) still exist alongside it.""" from spyde.actions import ipf_refine from spyde.actions.ipf_refine_render import build_refine_figure - _s, sim, _cache, _n = _lib() + _s, sim, _cache, _n = lib infos = ipf_refine.build_phase_ipf(sim) _fig, _fid, _html, panels = build_refine_figure(infos) panel = panels[0] @@ -127,7 +135,7 @@ def test_corr_rgba_lut_alpha_and_orientation(self): opaque = rgba[..., 3] == 255 assert opaque.sum() == n * n - 1 - def test_corr_rgba_matches_polygon_cell_position(self): + def test_corr_rgba_matches_polygon_cell_position(self, lib): """The raster places each correlation cell at the same (x, y) the old `_mesh_geometry` polygon for that cell centred on — using the real sector geometry: cell (i, j) sits at y = linspace(mins[1], maxs[1], n)[i], and @@ -135,7 +143,7 @@ def test_corr_rgba_matches_polygon_cell_position(self): from spyde.actions import ipf_refine from spyde.actions.ipf_refine_render import _corr_rgba, _lut, _mesh_geometry - _s, sim, _cache, _n = _lib() + _s, sim, _cache, _n = lib info = ipf_refine.build_phase_ipf(sim)[0] n = int(info["grid_n"]) outside = np.asarray(info["outside"]).reshape(n, n) @@ -167,14 +175,14 @@ def test_corr_rgba_matches_polygon_cell_position(self): assert ex[j] <= cx <= ex[j + 1] assert ey[i] <= cy <= ey[i + 1] - def test_update_panels_pushes_image_not_facecolors(self): + def test_update_panels_pushes_image_not_facecolors(self, lib): """The live update swaps the raster's pixels (`image_b64`) — NOT per-cell facecolors — and still moves the best-match marker + mask circles.""" from spyde.actions import ipf_refine from spyde.actions.ipf_refine_render import ( build_refine_figure, update_panels, best_xy_for, ) - s, sim, cache, _n = _lib() + s, sim, cache, _n = lib infos = ipf_refine.build_phase_ipf(sim) corr, best = ipf_refine.match_correlations( np.asarray(s.data[0, 0], float), sim, cache, gamma=0.5) @@ -208,9 +216,9 @@ def test_update_panels_pushes_image_not_facecolors(self): assert len(np.asarray(panel["best"]._data.get("offsets"))) == 1 assert len(panel["circle_grp"]._data.get("vertices_list")) == 1 - def test_rot_mask_from_circles_restricts(self): + def test_rot_mask_from_circles_restricts(self, lib): from spyde.actions import ipf_refine - s, sim, cache, n = _lib() + s, sim, cache, n = lib infos = ipf_refine.build_phase_ipf(sim) info = infos[0] corr, best = ipf_refine.match_correlations(np.asarray(s.data[1, 1], float), @@ -228,19 +236,19 @@ def test_rot_mask_from_circles_restricts(self): np.asarray(s.data[1, 1], float), sim, cache, gamma=0.5, rot_mask=mask) assert mask[int(best2[0])] - def test_no_circles_returns_none(self): + def test_no_circles_returns_none(self, lib): from spyde.actions import ipf_refine - infos = ipf_refine.build_phase_ipf(_lib()[1]) + infos = ipf_refine.build_phase_ipf(lib[1]) assert ipf_refine.rot_mask_from_circles(infos, {}, 100) is None class TestRefineController: - def test_controller_recompute_and_double_click_toggle(self): + def test_controller_recompute_and_double_click_toggle(self, lib): from spyde.actions import ipf_refine from spyde.actions.ipf_refine_render import ( build_refine_figure, RefineIpfController, ) - s, sim, cache, _n = _lib() + s, sim, cache, _n = lib infos = ipf_refine.build_phase_ipf(sim) _fig, _fid, _html, panels = build_refine_figure(infos) diff --git a/spyde/tests/migrated/test_locality_tag.py b/spyde/tests/migrated/test_locality_tag.py index 7fa41ed4..388dc25f 100644 --- a/spyde/tests/migrated/test_locality_tag.py +++ b/spyde/tests/migrated/test_locality_tag.py @@ -17,6 +17,7 @@ from spyde.signal_node import SignalNode from spyde.array_cache.locality import resolve_locality +from spyde.tests.migrated.conftest import _settle def _node(name, parent, local=None): @@ -80,7 +81,7 @@ def test_rebin_resolves_local(self, stem_4d_dataset): if not p.is_navigator and p.plot_state is not None) act = Rebin2DAction.for_plot(plot, scale_x=2, scale_y=2) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None assert tree.resolve_locality(new) is True @@ -93,7 +94,7 @@ def test_crop_resolves_local(self, stem_4d_dataset): if not p.is_navigator and p.plot_state is not None) act = CropAction.for_plot(plot, x0=2, x1=14, y0=4, y1=10) new = act.run() - time.sleep(0.2) + _settle(session) assert new is not None assert tree.resolve_locality(new) is True @@ -131,7 +132,7 @@ def test_auto_per_pattern_resolves_local(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) before = src.plot_state.current_signal czb_run(session, src, {"method": "center_of_mass"}) @@ -148,7 +149,7 @@ def test_auto_flat_field_resolves_opaque(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) before = src.plot_state.current_signal czb_run(session, src, {"method": "center_of_mass", "make_flat_field": True}) @@ -167,7 +168,7 @@ def test_manual_constant_shift_resolves_local(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_off_center_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree before = src.plot_state.current_signal diff --git a/spyde/tests/migrated/test_metadata_edit.py b/spyde/tests/migrated/test_metadata_edit.py index 4370e682..801a7d06 100644 --- a/spyde/tests/migrated/test_metadata_edit.py +++ b/spyde/tests/migrated/test_metadata_edit.py @@ -15,6 +15,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -31,7 +32,7 @@ def test_set_metadata_float_writes_back_and_re_emits(self): s = hs.signals.Signal2D(np.zeros((4, 5, 24, 24), np.float32)) s.set_signal_type("electron_diffraction") session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -64,7 +65,7 @@ def test_set_metadata_string_field(self): try: s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -86,7 +87,7 @@ def test_set_metadata_invalid_number_ignored(self): s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) s.metadata.set_item("Acquisition_instrument.TEM.magnification", 5000.0) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -111,7 +112,7 @@ def test_units_suffixed_display_string_rejected(self): s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) s.metadata.set_item("Acquisition_instrument.TEM.magnification", 5000.0) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -140,7 +141,7 @@ def test_non_finite_numbers_rejected(self): s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) s.metadata.set_item("Acquisition_instrument.TEM.magnification", 5000.0) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -162,7 +163,7 @@ def test_set_metadata_readonly_derived_field_ignored(self): try: s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) tree = plot.signal_tree @@ -181,7 +182,7 @@ def test_set_metadata_unknown_cell_ignored(self): try: s = hs.signals.Signal2D(np.zeros((8, 8), np.float32)) session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) session._set_metadata( plot, {"group": "Nonexistent Group", "prop": "Nope", "value": "1"} diff --git a/spyde/tests/migrated/test_movie_block.py b/spyde/tests/migrated/test_movie_block.py index 0a85888c..a2309487 100644 --- a/spyde/tests/migrated/test_movie_block.py +++ b/spyde/tests/migrated/test_movie_block.py @@ -20,6 +20,7 @@ from spyde.actions.report import handlers as H from spyde.actions.report import movie as M +from spyde.tests.migrated.conftest import _settle # ── helpers ────────────────────────────────────────────────────────────────────── @@ -524,7 +525,14 @@ def test_play_emits_frames_and_stops(self, movie_dataset): cell_id = _add_movie(session, messages) M.movie_open(session, None, {"cell_id": cell_id}) M.movie_play(session, None, {"cell_id": cell_id}) - time.sleep(0.8) + # Poll for >=2 movie_frame events (early exit) instead of a flat 0.8 s + # play window. + deadline = time.time() + 5.0 + while time.time() < deadline: + if len([m for m in messages + if m.get("type") == "movie_frame"]) >= 2: + break + time.sleep(0.02) M.movie_stop(session, None, {"cell_id": cell_id}) frames = [m for m in messages if m.get("type") == "movie_frame"] assert len(frames) >= 2, "play did not emit movie_frame events" @@ -805,7 +813,7 @@ def _big_movie_dataset(session, edge=1100, n_frames=3): tax.name, tax.units, tax.scale = "time", "sec", 0.1 s.set_signal_type("insitu") session._add_signal(s, source_path=None) - time.sleep(1.0) + _settle(session) class TestTileModeInEditor: diff --git a/spyde/tests/migrated/test_multiphase_orientation.py b/spyde/tests/migrated/test_multiphase_orientation.py index fd9dd064..b6b1e847 100644 --- a/spyde/tests/migrated/test_multiphase_orientation.py +++ b/spyde/tests/migrated/test_multiphase_orientation.py @@ -14,6 +14,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle CIF = os.path.join(os.path.dirname(__file__), "..", "Silver__0011135.cif") @@ -61,7 +62,7 @@ def test_two_phase_map_and_2d_ipf(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree before = len(session.signal_trees) @@ -91,7 +92,7 @@ def test_generate_library_accepts_multiple_cifs(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree # Two CIFs (degenerate here, but exercises the multi-phase code path). diff --git a/spyde/tests/migrated/test_nav_async_cancel.py b/spyde/tests/migrated/test_nav_async_cancel.py index 00029fb7..83543022 100644 --- a/spyde/tests/migrated/test_nav_async_cancel.py +++ b/spyde/tests/migrated/test_nav_async_cancel.py @@ -298,10 +298,13 @@ def test_stale_frame_does_not_paint_over_a_newer_one(self): data, arr = _movie() sig = _FakeSignal(data, nav_dim=1) - # Two reads in order; let both complete. + # Two reads in order; let both complete. The pool has ONE worker, + # so a barrier task resolving proves both reads AND their done- + # callbacks (which run on the worker thread) have finished — no + # flat sleep needed. _submit_async_nav_read(plot, sig, np.array([1]), False, _Prof()) _submit_async_nav_read(plot, sig, np.array([7]), False, _Prof()) - time.sleep(0.6) + pool.submit(lambda: None).result(timeout=5.0) sess.drain() assert plot.painted, "the newer read should have painted" @@ -315,7 +318,7 @@ def test_stale_frame_does_not_paint_over_a_newer_one(self): newest_painted = plot._nav_painted_seq plot._nav_read_seq = newest_painted - 2 # this read is "behind" _submit_async_nav_read(plot, sig, np.array([1]), False, _Prof()) - time.sleep(0.6) + pool.submit(lambda: None).result(timeout=5.0) # read + callback done sess.drain() assert len(plot.painted) == painted_before, \ diff --git a/spyde/tests/migrated/test_nav_orientation.py b/spyde/tests/migrated/test_nav_orientation.py index fbda5caf..ead6abbe 100644 --- a/spyde/tests/migrated/test_nav_orientation.py +++ b/spyde/tests/migrated/test_nav_orientation.py @@ -18,6 +18,7 @@ import hyperspy.api as hs from spyde.drawing.update_functions import update_from_navigation_selection +from spyde.tests.migrated.conftest import _settle def _encoded_4d(nav=(3, 5), sig=(4, 4)): @@ -38,7 +39,7 @@ def test_crosshair_selects_data_iy_ix(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_encoded_4d(), source_path=None) - time.sleep(0.4) + _settle(session) tree = session.signal_trees[0] sel = tree.navigator_plot_manager.all_navigation_selectors[0] child = next(p for p in session._plots diff --git a/spyde/tests/migrated/test_nav_progressive.py b/spyde/tests/migrated/test_nav_progressive.py index b6fd7746..26e46e1a 100644 --- a/spyde/tests/migrated/test_nav_progressive.py +++ b/spyde/tests/migrated/test_nav_progressive.py @@ -42,13 +42,29 @@ def _make_session(): _ARMED = threading.Event() -def _slow_navigator_4d(nav=(16, 16), sig=(8, 8)): +def _slow_navigator_4d(nav=(16, 16), sig=(8, 8), free_pos=None, nav_chunks=None): """A lazy 4-D signal whose per-chunk read sleeps until the test releases the - gate — simulating a large scan whose virtual-image sum is slow to compute.""" + gate — simulating a large scan whose virtual-image sum is slow to compute. + + With ``free_pos=(iy, ix)`` (and a multi-chunk ``nav_chunks`` grid) the ONE + block containing that nav position passes the gate freely: the navigator + sum still blocks (it needs every other block), while a single-frame DP + read of that position can complete. Gating EVERY block was the fixture + flaw that made 'DP while nav computes' untestable — the DP slice blocked + at the same gate as the navigator sum.""" ny, nx = nav + # Identify the free block by its CONTENT (each frame is a constant, unique + # value), not by block_info coordinates — dask's slicing pushdown can hand + # the block function a rewritten task whose array-location is relative to + # the sliced array, so coordinate keying silently gates the wrong blocks. + free_value = (float(free_pos[0] * nx + free_pos[1] + 1) + if free_pos is not None else None) def _slow_block(block, block_info=None): if _ARMED.is_set(): + if free_value is not None and np.any( + np.asarray(block)[..., 0, 0] == free_value): + return block # the DP probe's block passes freely # The navigator sum traverses all blocks; block until released so the # nav image can't finish before the test checks the windows. _NAV_COMPUTED.set() @@ -59,7 +75,7 @@ def _slow_block(block, block_info=None): for iy in range(ny): for ix in range(nx): base[iy, ix] = float(iy * nx + ix + 1) - arr = da.from_array(base, chunks=(ny, nx) + sig) + arr = da.from_array(base, chunks=(nav_chunks or (ny, nx)) + sig) arr = arr.map_blocks(_slow_block, dtype=np.float32) s = hs.signals.Signal2D(arr).as_lazy() s.set_signal_type("electron_diffraction") @@ -110,27 +126,35 @@ def test_windows_and_crosshair_ready_before_nav_image(self, monkeypatch): _GATE.set() session.shutdown() - @pytest.mark.xfail( - reason="Pre-existing fixture flaw (fails on clean main too): _slow_block " - "gates EVERY block compute, so the single-frame DP slice blocks at the " - "same gate as the navigator sum — the test can't actually exercise 'DP " - "while nav computes' with this synthetic data. Unrelated to the serial " - "nav-dispatcher.", - strict=False, - ) def test_crosshair_selects_frame_while_nav_still_computing(self, monkeypatch): """The crosshair can move and select a diffraction pattern BEFORE the - navigator virtual image has finished.""" + navigator virtual image has finished. + + (Formerly a dead non-strict xfail: the fixture gated EVERY block, so + every DP read — including the load-time read at the crosshair's + DEFAULT CENTER — blocked at the same gate as the navigator sum, + wedging the serial dispatcher; the test could never pass and timed + out its poll on every run. The fixture now exempts the ONE 8x8 + nav-chunk holding the default center AND the probed position, so + DP reads complete while the sum stays blocked on the other three + chunks.)""" monkeypatch.setenv("SPYDE_NO_DASK", "1") session = _make_session() try: nx = 16 - s = _slow_navigator_4d(nav=(16, nx)) + # 2x2 nav-chunk grid. The free block must be the one holding the + # crosshair's DEFAULT CENTER (8, 8): the selector fires a read + # there at load, on the same serial dispatcher — if that read + # gates, the probe below never runs. Probe a different position + # inside the same chunk. + ix, iy = 10, 9 # chunk (1, 1), like (8, 8) + s = _slow_navigator_4d(nav=(16, nx), free_pos=(iy, ix), + nav_chunks=(8, 8)) _ARMED.set() session._add_signal(s, source_path=None) - time.sleep(0.2) # let the background nav compute start + hit the gate - - assert _NAV_COMPUTED.is_set(), "nav compute never started" + # The progressive fill is deferred until the first signal frame + # paints, so wait on the event rather than a flat sleep. + assert _NAV_COMPUTED.wait(timeout=10), "nav compute never started" assert not _GATE.is_set() # still blocked mid-compute tree = session.signal_trees[-1] @@ -139,24 +163,26 @@ def test_crosshair_selects_frame_while_nav_still_computing(self, monkeypatch): sel = mgr.navigation_selectors[pw][0] cross = getattr(sel, "_crosshair_selector", sel) - # Move the crosshair to (ix=4, iy=3) and force an update — must work - # even though the nav image is still blocked. - ix, iy = 4, 3 + # Move the crosshair and force an update — must work even though + # the nav image is still blocked. cross._widget.cx = float(ix) cross._widget.cy = float(iy) sel.delayed_update_data(force=True) - # Updates now run on the serial nav-dispatcher (async); poll the - # crosshair's child for the painted frame instead of a fixed sleep. + # Updates run on the serial nav-dispatcher (async); poll the + # crosshair's child for the PROBE's frame (the load-time read may + # already have painted the default-center frame). + expected = float(iy * nx + ix + 1) child = next(iter(cross.children.keys())) data = None for _ in range(40): data = child.current_data - if isinstance(data, np.ndarray): + if (isinstance(data, np.ndarray) + and abs(float(np.mean(data)) - expected) < 1e-3): break time.sleep(0.05) assert isinstance(data, np.ndarray), "crosshair didn't select a DP frame" - assert abs(float(np.mean(data)) - float(iy * nx + ix + 1)) < 1e-3 + assert abs(float(np.mean(data)) - expected) < 1e-3 # The nav image compute is still blocked at the gate — proving the # crosshair worked WHILE the navigator was mid-compute. assert not _GATE.is_set(), "gate released — nav compute not blocked" diff --git a/spyde/tests/migrated/test_nav_scale.py b/spyde/tests/migrated/test_nav_scale.py index 2b6138b2..565ead77 100644 --- a/spyde/tests/migrated/test_nav_scale.py +++ b/spyde/tests/migrated/test_nav_scale.py @@ -22,6 +22,7 @@ import numpy as np import hyperspy.api as hs import pytest +from spyde.tests.migrated.conftest import _settle def _make_session(): @@ -80,7 +81,7 @@ def test_crosshair_pixel_maps_to_same_index_regardless_of_calibration( try: s = _ramp_4d((4, 5), scale=scale, offset=offset) # ny=4, nx=5 session._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(session) sel = _navigator_selector(session) ix, iy = 2, 1 @@ -105,13 +106,13 @@ def test_scaled_navigator_selects_correct_diffraction_pattern(self): nx = 5 s = _ramp_4d((4, nx), sig=(8, 8), scale=3.0, units="nm") session._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(session) sel = _navigator_selector(session) ix, iy = 3, 2 _set_crosshair_pixels(sel, ix, iy) sel.delayed_update_data(force=True) - time.sleep(0.4) + _settle(session) # The child (signal) plot must now hold the DP for frame k. child = next(iter(sel.children.keys())) diff --git a/spyde/tests/migrated/test_nav_shape_prompt.py b/spyde/tests/migrated/test_nav_shape_prompt.py index a018cbf6..2198b256 100644 --- a/spyde/tests/migrated/test_nav_shape_prompt.py +++ b/spyde/tests/migrated/test_nav_shape_prompt.py @@ -18,6 +18,7 @@ import dask.array as da import hyperspy.api as hs import pytest +from spyde.tests.migrated.conftest import _settle def _make_session(): @@ -76,7 +77,7 @@ def test_confirm_applies_step_size_and_opens(self, captured_messages, monkeypatc sig = _lazy_4d(nav=(5, 4)) session._prompt_nav_shape(sig, "scan.mrc") session._confirm_nav_shape({"nav_shape": [5, 4], "step_size": 3.0, "units": "nm"}) - time.sleep(0.4) + _settle(session) tree = session.signal_trees[-1] nav_axes = tree.root.axes_manager.navigation_axes @@ -96,7 +97,7 @@ def test_confirm_reshapes_flat_stack_lazily(self, captured_messages, monkeypatch session._prompt_nav_shape(sig, "stack.mrc") # Fold 12 → (4, 3) display scan grid with a 2 nm step. session._confirm_nav_shape({"nav_shape": [4, 3], "step_size": 2.0, "units": "nm"}) - time.sleep(0.4) + _settle(session) root = session.signal_trees[-1].root assert root.axes_manager.navigation_shape == (4, 3), \ @@ -114,7 +115,7 @@ def test_confirm_with_wrong_frame_count_falls_back(self, captured_messages, monk session._prompt_nav_shape(sig, "stack.mrc") # 5×3 = 15 ≠ 12 → reshape rejected; opens as-loaded + emits an error. session._confirm_nav_shape({"nav_shape": [5, 3], "step_size": 1.0, "units": "nm"}) - time.sleep(0.4) + _settle(session) assert _msgs_of(captured_messages, "error"), "no error on bad shape" assert _msgs_of(captured_messages, "window_opened"), "should still open as-loaded" finally: diff --git a/spyde/tests/migrated/test_neural_batch_memory.py b/spyde/tests/migrated/test_neural_batch_memory.py index 350973d9..38d6bbfb 100644 --- a/spyde/tests/migrated/test_neural_batch_memory.py +++ b/spyde/tests/migrated/test_neural_batch_memory.py @@ -28,6 +28,27 @@ import sys import textwrap +import pytest + + +def _cuda_available() -> bool: + # CUDA specifically, NOT gpu_available(): that predicate is True on Apple + # MPS too, and this file measures torch.cuda peak bytes — its driver + # asserts the model landed on cuda, so an MPS runner must SKIP, not run + # (the macos-latest CI leg caught exactly that). Import-and-check is safe + # in-process; it is torch-CUDA *work* that segfaults under pytest on + # Windows, and the ~4 s probe subprocess this replaces existed only to + # make this same decision. + try: + import torch + return bool(torch.cuda.is_available()) + except Exception: + return False + + +pytestmark = pytest.mark.skipif( + not _cuda_available(), reason="needs CUDA (measures torch.cuda peak memory)") + _DRIVER = textwrap.dedent(r""" import json, sys, os import numpy as np @@ -50,14 +71,7 @@ def planted_stack(n, shape=(128, 128), amp=400.0, sigma=2.2, seed=0): mode = sys.argv[1] out = {} - if mode == "check_cuda": - import torch - out["cuda"] = bool(torch.cuda.is_available()) - print("RESULT_JSON", json.dumps(out)) - sys.stdout.flush() - os._exit(0) - - elif mode == "scaling": + if mode == "scaling": import torch from spyde import models @@ -128,11 +142,6 @@ def _run(mode, timeout=300): class TestNeuralBatchMemory: def test_peak_memory_scales_with_batch_not_stack_size(self): - cuda = _run("check_cuda") - if not cuda["cuda"]: - import pytest - pytest.skip("no CUDA device available in this environment") - out = _run("scaling") assert out["peak_small_bytes"] > 0 assert out["peak_large_bytes"] > 0 diff --git a/spyde/tests/migrated/test_neural_detect.py b/spyde/tests/migrated/test_neural_detect.py index b073fae7..66c6b813 100644 --- a/spyde/tests/migrated/test_neural_detect.py +++ b/spyde/tests/migrated/test_neural_detect.py @@ -1,9 +1,13 @@ """Correctness tests for the vendored SpotUNet detector + the model registry. -Run in a SUBPROCESS that prints a JSON result and ``os._exit(0)`` after, matching +Run in ONE SUBPROCESS (all modes sequentially, one tagged ``RESULT_JSON + {...}`` line each, then ``os._exit(0)``), matching ``test_vector_orientation_gpu.py``: torch teardown (esp. with CUDA) can segfault -at interpreter exit inside the pytest process on Windows. The model itself runs on -CPU here so these checks don't need a GPU. +at interpreter exit inside the pytest process on Windows, and a fresh +subprocess per test paid the cold ``import spyde.models``+torch (~4-5 s) five +times over. The ``upgrade`` mode mutates (backs up/restores) the user +registry file, so it runs LAST. The model itself runs on CPU here so these +checks don't need a GPU. Covers: - the bundled model loads via ``registry.get_model()`` with the registry arch, @@ -21,11 +25,25 @@ import sys import textwrap +import pytest + _DRIVER = textwrap.dedent(r""" import json, sys, os, tempfile import numpy as np from scipy.ndimage import gaussian_filter + # Prime cublasLt with a tiny F.linear BEFORE any conv work: on Pascal + # (torch cu124) the FIRST cublasLt init that happens after cuDNN convs + # fails with CUBLAS_STATUS_NOT_INITIALIZED — a long multi-mode process is + # exactly where that ordering can arise (get_model() picks CUDA on dev + # boxes even though the assertions themselves are device-agnostic). + import torch + if torch.cuda.is_available(): + import torch.nn.functional as F + F.linear(torch.zeros(1, 1, device="cuda"), + torch.zeros(1, 1, device="cuda")) + torch.cuda.synchronize() + def planted_frame(centers, shape=(112, 112), amp=400.0, sigma=2.2): f = np.zeros(shape, np.float32) for (cy, cx) in centers: @@ -42,110 +60,126 @@ def nearest_dist(peaks, centers): d.append(dd) return float(max(d)) - mode = sys.argv[1] - out = {} - - if mode == "load": - from spyde import models - from spyde.models.unet import SpotUNet - m, dev = models.get_model() - out["is_spotunet"] = isinstance(m, SpotUNet) - out["levels"] = int(m.levels) - out["params"] = int(m.num_params()) - - elif mode == "detect": - from spyde import models - m, dev = models.get_model() - centers = [(40, 50), (70, 30), (20, 80)] - f = planted_frame(centers) - peaks = np.asarray(models.detect(m, f, dev, thresh=0.3), np.float32).reshape(-1, 3) - # The net should localise the planted spots to within a few px (it fires - # elsewhere too on this synthetic frame — we only require it FINDS these). - out["n"] = int(len(peaks)) - out["worst_planted_dist"] = nearest_dist(peaks, centers) - - elif mode == "batch": - from spyde import models - m, dev = models.get_model() - centers = [(40, 50), (70, 30)] - frames = np.stack([planted_frame(centers), planted_frame(centers)]) - single = np.asarray(models.detect(m, frames[0], dev, thresh=0.3), np.float32).reshape(-1, 3) - batch = models.detect_batch(m, frames, dev, thresh=0.3) - b0 = np.asarray(batch[0], np.float32).reshape(-1, 3) - out["n_frames"] = len(batch) - out["single_n"] = int(len(single)) - out["batch0_n"] = int(len(b0)) - # Same count, and positions agree to subpixel (same model, same decode). - out["counts_match"] = (len(single) == len(b0)) - if len(single) == len(b0) and len(single): - so = single[np.lexsort((single[:, 1], single[:, 0]))] - bo = b0[np.lexsort((b0[:, 1], b0[:, 0]))] - out["max_pos_diff"] = float(np.abs(so[:, :2] - bo[:, :2]).max()) - else: - out["max_pos_diff"] = 0.0 - - elif mode == "fallback": - # Unknown id with no working remote → bundled default, no exception. - from spyde import models - from spyde.models import registry, default_model_id - m, dev = models.get_model("definitely-not-a-real-model-xyz") - out["fell_back"] = m is not None - out["default"] = default_model_id() - - elif mode == "upgrade": - # A user registry.json adds a -v2 entry and advances `default`. - from spyde.models import registry - udir = registry.user_models_dir() - man = { - "default": "spotunet-base16-v2", - "models": [{ - "id": "spotunet-base16-v2", - "label": "SpotUNet base16 v2 (user)", - "version": 2, - "arch": {"base": 16, "in_ch": 1, "levels": 2}, - "source": {"type": "hf", "repo": "x/y", "file": "v2.pt"}, - }], - } - path = os.path.join(udir, "registry.json") - # Don't clobber a real user file: back it up. - backup = None - if os.path.exists(path): - backup = path + ".bak_test" - os.replace(path, backup) - try: - with open(path, "w", encoding="utf-8") as fh: - json.dump(man, fh) - registry._invalidate_manifest() - avail = registry.available_models() - ids = [m["id"] for m in avail["models"]] - out["default"] = avail["default"] - out["has_v2"] = "spotunet-base16-v2" in ids - out["still_has_bundled"] = "spotunet-base16-v1" in ids - finally: - os.remove(path) - if backup: - os.replace(backup, path) - registry._invalidate_manifest() - - print("RESULT_JSON", json.dumps(out)) - sys.stdout.flush() + def run_mode(mode): + out = {} + + if mode == "load": + from spyde import models + from spyde.models.unet import SpotUNet + m, dev = models.get_model() + out["is_spotunet"] = isinstance(m, SpotUNet) + out["levels"] = int(m.levels) + out["params"] = int(m.num_params()) + + elif mode == "detect": + from spyde import models + m, dev = models.get_model() + centers = [(40, 50), (70, 30), (20, 80)] + f = planted_frame(centers) + peaks = np.asarray(models.detect(m, f, dev, thresh=0.3), np.float32).reshape(-1, 3) + # The net should localise the planted spots to within a few px (it fires + # elsewhere too on this synthetic frame — we only require it FINDS these). + out["n"] = int(len(peaks)) + out["worst_planted_dist"] = nearest_dist(peaks, centers) + + elif mode == "batch": + from spyde import models + m, dev = models.get_model() + centers = [(40, 50), (70, 30)] + frames = np.stack([planted_frame(centers), planted_frame(centers)]) + single = np.asarray(models.detect(m, frames[0], dev, thresh=0.3), np.float32).reshape(-1, 3) + batch = models.detect_batch(m, frames, dev, thresh=0.3) + b0 = np.asarray(batch[0], np.float32).reshape(-1, 3) + out["n_frames"] = len(batch) + out["single_n"] = int(len(single)) + out["batch0_n"] = int(len(b0)) + # Same count, and positions agree to subpixel (same model, same decode). + out["counts_match"] = (len(single) == len(b0)) + if len(single) == len(b0) and len(single): + so = single[np.lexsort((single[:, 1], single[:, 0]))] + bo = b0[np.lexsort((b0[:, 1], b0[:, 0]))] + out["max_pos_diff"] = float(np.abs(so[:, :2] - bo[:, :2]).max()) + else: + out["max_pos_diff"] = 0.0 + + elif mode == "fallback": + # Unknown id with no working remote → bundled default, no exception. + from spyde import models + from spyde.models import registry, default_model_id + m, dev = models.get_model("definitely-not-a-real-model-xyz") + out["fell_back"] = m is not None + out["default"] = default_model_id() + + elif mode == "upgrade": + # A user registry.json adds a -v2 entry and advances `default`. + from spyde.models import registry + udir = registry.user_models_dir() + man = { + "default": "spotunet-base16-v2", + "models": [{ + "id": "spotunet-base16-v2", + "label": "SpotUNet base16 v2 (user)", + "version": 2, + "arch": {"base": 16, "in_ch": 1, "levels": 2}, + "source": {"type": "hf", "repo": "x/y", "file": "v2.pt"}, + }], + } + path = os.path.join(udir, "registry.json") + # Don't clobber a real user file: back it up. + backup = None + if os.path.exists(path): + backup = path + ".bak_test" + os.replace(path, backup) + try: + with open(path, "w", encoding="utf-8") as fh: + json.dump(man, fh) + registry._invalidate_manifest() + avail = registry.available_models() + ids = [m["id"] for m in avail["models"]] + out["default"] = avail["default"] + out["has_v2"] = "spotunet-base16-v2" in ids + out["still_has_bundled"] = "spotunet-base16-v1" in ids + finally: + os.remove(path) + if backup: + os.replace(backup, path) + registry._invalidate_manifest() + + return out + + for mode in sys.argv[1:]: + print("RESULT_JSON", mode, json.dumps(run_mode(mode))) + sys.stdout.flush() os._exit(0) """) -def _run(mode): +# `upgrade` mutates (backs up/restores) the user registry file — keep it LAST. +_MODES = ("load", "detect", "batch", "fallback", "upgrade") + + +@pytest.fixture(scope="module") +def detect_results(): + """Run the driver once for all modes; return {mode: parsed JSON dict}.""" proc = subprocess.run( - [sys.executable, "-c", _DRIVER, mode], - capture_output=True, text=True, timeout=300) + [sys.executable, "-c", _DRIVER, *_MODES], + capture_output=True, text=True, timeout=600) assert proc.returncode == 0, ( f"subprocess failed ({proc.returncode}):\n{proc.stdout}\n{proc.stderr}") - line = next(l for l in proc.stdout.splitlines() if l.startswith("RESULT_JSON")) - return json.loads(line[len("RESULT_JSON "):]) + results = {} + for line in proc.stdout.splitlines(): + if line.startswith("RESULT_JSON "): + _tag, mode, payload = line.split(" ", 2) + results[mode] = json.loads(payload) + missing = [m for m in _MODES if m not in results] + assert not missing, ( + f"driver emitted no result for {missing}:\n{proc.stdout}\n{proc.stderr}") + return results class TestNeuralDetect: - def test_bundled_model_loads(self): - out = _run("load") + def test_bundled_model_loads(self, detect_results): + out = detect_results["load"] assert out["is_spotunet"] # levels must match whatever the registry declares for the default model # (don't hardcode: the default has been upgraded before, e.g. production @@ -156,27 +190,27 @@ def test_bundled_model_loads(self): assert out["levels"] == entry["arch"]["levels"] assert out["params"] > 0 - def test_detect_localises_planted_spots(self): - out = _run("detect") + def test_detect_localises_planted_spots(self, detect_results): + out = detect_results["detect"] assert out["n"] > 0 # Each planted disk has a detection within a few px. assert out["worst_planted_dist"] <= 3.0, out - def test_batch_matches_single(self): - out = _run("batch") + def test_batch_matches_single(self, detect_results): + out = detect_results["batch"] assert out["n_frames"] == 2 assert out["counts_match"], out assert out["max_pos_diff"] <= 0.5, out - def test_registry_fallback(self): - out = _run("fallback") + def test_registry_fallback(self, detect_results): + out = detect_results["fallback"] assert out["fell_back"] # fallback lands on whatever the registry's current default is from spyde.models import registry assert out["default"] == registry.default_model_id() - def test_registry_upgrade_merge(self): - out = _run("upgrade") + def test_registry_upgrade_merge(self, detect_results): + out = detect_results["upgrade"] assert out["has_v2"] assert out["still_has_bundled"] assert out["default"] == "spotunet-base16-v2" diff --git a/spyde/tests/migrated/test_offset_crosshair.py b/spyde/tests/migrated/test_offset_crosshair.py index 70e9cc3c..c54d296c 100644 --- a/spyde/tests/migrated/test_offset_crosshair.py +++ b/spyde/tests/migrated/test_offset_crosshair.py @@ -12,6 +12,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -62,7 +63,7 @@ def _session_with_plot(self): for ax in s.axes_manager.signal_axes: ax.scale, ax.offset = 0.1, 0.0 session._add_signal(s) - time.sleep(0.3) + _settle(session) plot = _signal_plot(session) return session, plot @@ -155,7 +156,7 @@ def test_navigator_plot_edits_navigation_axes(self): for a in s.axes_manager.navigation_axes: a.scale, a.offset = 2.0, 0.0 session._add_signal(s) - time.sleep(0.3) + _settle(session) navp = next((p for p in session._plots if p.is_navigator), None) assert navp is not None navp._plot2d = _FakePlot2D() diff --git a/spyde/tests/migrated/test_orientation_compute.py b/spyde/tests/migrated/test_orientation_compute.py index 25f2f478..ceceedec 100644 --- a/spyde/tests/migrated/test_orientation_compute.py +++ b/spyde/tests/migrated/test_orientation_compute.py @@ -70,6 +70,33 @@ def library(): ) +def _reference_calibration_signal(): + """Blank signal carrying the one signal-axis geometry every signal in + this module shares (KYxKX at SCALE, calibration.center=None).""" + s = hs.signals.Signal2D(np.zeros((KY, KX), dtype=np.float32)) + s.set_signal_type("electron_diffraction") + for ax in s.axes_manager.signal_axes: + ax.scale = SCALE + ax.units = "A^-1" + s.calibration.center = None + return s + + +@pytest.fixture(scope="module") +def matching_cache(library): + """Module-scoped polar-geometry + template cache. + + Rebuilding this cache (signal.calibration.get_slices2d + the polar + templates) is the dominant cost of every _do_compute_orientations call + (~7 s), while the cache itself is geometry- and library-dependent only + (build_matching_cache docstring) — and every signal in this module shares + one geometry. Injecting it via the existing ``cache=`` kwarg is + behaviour-preserving: the dict is exactly what the call would rebuild. + (The no-cache branch stays exercised in-suite through the GUI om_run + path — orientation_action.py passes no cache.)""" + return build_matching_cache(_reference_calibration_signal(), library) + + def _render_pattern(coords, intensities, inplane_deg=0.0): """Draw gaussian spots for (kx, ky) Å^-1 coords on a KYxKX grid, optionally rotated in-plane by inplane_deg.""" @@ -166,14 +193,15 @@ class TestPyxemConsistency: orientation recovery is pyxem's own concern and needs realistic patterns; synthetic spot renders are too degenerate to test it.)""" - def test_rows_and_quats_match_pyxem(self, library): + def test_rows_and_quats_match_pyxem(self, library, matching_cache): quats_t, _ = template_tables(library) phase = sim_phases_list(library)[0] rng = np.random.default_rng(0) picks = rng.choice(len(quats_t), size=4, replace=False) s = _make_signal_from_templates(library, picks, nav_shape=(2, 2)) - om = _do_compute_orientations(s, library, PARAMS, None, None) + om = _do_compute_orientations(s, library, PARAMS, None, None, + cache=matching_cache) assert isinstance(om, SpyDEOrientationMap) assert om.nav_shape == (2, 2) and om.n_best == 3 @@ -203,7 +231,7 @@ def test_rows_and_quats_match_pyxem(self, library): # TestResolveQuaternions on non-degenerate constructions. _ = ref_quats - def test_inplane_delta(self, library): + def test_inplane_delta(self, library, matching_cache): """Rotating the pattern in-plane by delta must rotate the recovered orientation by ~delta about the beam axis — a convention-free check that the in-plane angle is composed correctly.""" @@ -224,16 +252,18 @@ def test_inplane_delta(self, library): ax.scale = SCALE s.calibration.center = None - om = _do_compute_orientations(s, library, PARAMS, None, None) + om = _do_compute_orientations(s, library, PARAMS, None, None, + cache=matching_cache) mis = _misorientation_deg(om.quats[0, 0, 0], om.quats[0, 1, 0], phase) assert abs(mis - delta) < 3.0, ( f"in-plane delta {delta} deg recovered as {mis:.1f} deg" ) - def test_correlation_sorted_and_positive(self, library): + def test_correlation_sorted_and_positive(self, library, matching_cache): s = _make_signal_from_templates(library, [3, 11], nav_shape=(1, 2)) - om = _do_compute_orientations(s, library, PARAMS, None, None) + om = _do_compute_orientations(s, library, PARAMS, None, None, + cache=matching_cache) c = om.corr assert (np.diff(c, axis=-1) <= 1e-6).all(), "corr not best-first" assert (c[..., 0] > 0).all() @@ -241,14 +271,15 @@ def test_correlation_sorted_and_positive(self, library): class TestChunkingAndMemory: - def test_chunked_equals_single_chunk(self, library): + def test_chunked_equals_single_chunk(self, library, matching_cache): quats, _ = template_tables(library) rng = np.random.default_rng(1) picks = rng.choice(len(quats), size=8, replace=False) s_np = _make_signal_from_templates(library, picks, nav_shape=(2, 4)) om_single = _do_compute_orientations(s_np, library, PARAMS, - None, None) + None, None, + cache=matching_cache) s_lazy = hs.signals.Signal2D( da.from_array(np.asarray(s_np.data), chunks=(1, 2, KY, KX)) @@ -258,14 +289,15 @@ def test_chunked_equals_single_chunk(self, library): ax.scale = SCALE s_lazy.calibration.center = None om_chunked = _do_compute_orientations(s_lazy, library, PARAMS, - None, None) + None, None, + cache=matching_cache) np.testing.assert_allclose(om_chunked.quats, om_single.quats, atol=1e-5) np.testing.assert_allclose(om_chunked.corr, om_single.corr, rtol=1e-5) - def test_never_computes_full_dataset(self, library): + def test_never_computes_full_dataset(self, library, matching_cache): """Memory contract: only per-chunk slices may be materialised.""" quats, _ = template_tables(library) picks = np.arange(8) @@ -287,16 +319,18 @@ def _spy(self, *a, **k): return _orig(self, *a, **k) with patch.object(da.Array, "compute", _spy): - om = _do_compute_orientations(s, library, PARAMS, None, None) + om = _do_compute_orientations(s, library, PARAMS, None, None, + cache=matching_cache) assert om.nav_shape == (2, 4) - def test_stopped_flag_returns_none(self, library): + def test_stopped_flag_returns_none(self, library, matching_cache): s = _make_signal_from_templates(library, [0], nav_shape=(1, 1)) out = _do_compute_orientations(s, library, PARAMS, None, None, - stopped_flag=[True]) + stopped_flag=[True], + cache=matching_cache) assert out is None - def test_live_shm_rgb_written(self, library): + def test_live_shm_rgb_written(self, library, matching_cache): from spyde.drawing.update_functions import ( ensure_live_buffer, read_live_buffer, ) @@ -308,7 +342,8 @@ def test_live_shm_rgb_written(self, library): shm = ensure_live_buffer((2, 2, 9), shm_name) try: om = _do_compute_orientations(s, library, PARAMS, None, None, - shm_name=shm_name) + shm_name=shm_name, + cache=matching_cache) arr = read_live_buffer((2, 2, 9), shm_name) for di, direction in enumerate(("x", "y", "z")): expected = om.ipf_color_map(direction).astype(np.float32) @@ -331,6 +366,13 @@ def two_phase_library(self): reciprocal_radius=RECIP_RADIUS, ) + @pytest.fixture(scope="class") + def two_phase_cache(self, two_phase_library): + """Class-scoped analogue of ``matching_cache`` for the two-phase + library (same geometry, different template set).""" + return build_matching_cache(_reference_calibration_signal(), + two_phase_library) + def test_template_tables_match_get_simulation(self, two_phase_library): sim = two_phase_library quats, phase_of = template_tables(sim) @@ -342,14 +384,15 @@ def test_template_tables_match_get_simulation(self, two_phase_library): ) assert int(pidx) == int(phase_of[lib_idx]) - def test_phase_recovered(self, two_phase_library): + def test_phase_recovered(self, two_phase_library, two_phase_cache): sim = two_phase_library quats, phase_of = template_tables(sim) # one pattern from each phase i_al = int(np.where(phase_of == 0)[0][3]) i_mg = int(np.where(phase_of == 1)[0][3]) s = _make_signal_from_templates(sim, [i_al, i_mg], nav_shape=(1, 2)) - om = _do_compute_orientations(s, sim, PARAMS, None, None) + om = _do_compute_orientations(s, sim, PARAMS, None, None, + cache=two_phase_cache) assert om.n_phases == 2 assert int(om.phase_idx[0, 0, 0]) == 0 assert int(om.phase_idx[0, 1, 0]) == 1 diff --git a/spyde/tests/migrated/test_orientation_overlay.py b/spyde/tests/migrated/test_orientation_overlay.py index e9e5b305..4522227d 100644 --- a/spyde/tests/migrated/test_orientation_overlay.py +++ b/spyde/tests/migrated/test_orientation_overlay.py @@ -12,11 +12,11 @@ """ from __future__ import annotations -import time - import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle + def _signal_plot(session): return next((p for p in session._plots @@ -51,7 +51,7 @@ def test_overlay_attaches_and_draws_template_spots(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_centered_diffraction_4d()) - time.sleep(0.3) + _settle(session) src_tree = session.signal_trees[0] src_plot = _signal_plot(session) @@ -67,6 +67,11 @@ def test_overlay_attaches_and_draws_template_spots(self): assert overlay is not None, "orientation overlay never attached" assert overlay._mg is not None + # The hook is registered on a navigator selector (real-drag path). + sels = [s for s in src_tree.navigator_plot_manager.all_navigation_selectors + if overlay._on_indices in s.index_hooks] + assert sels, "overlay hook not registered on any navigator selector" + # Push a concrete nav position through the hook and inspect offsets. overlay._on_indices(np.array([[1, 1]])) offsets = np.asarray(overlay._mg._data["offsets"], dtype=np.float64) @@ -76,6 +81,15 @@ def test_overlay_attaches_and_draws_template_spots(self): assert offsets.shape[1] == 2 assert offsets.min() >= -0.5 and offsets.max() <= 32.5 assert np.isfinite(offsets).all() + + # Moving to two more positions both yield a valid (finite, + # in-frame) push. + for (iy, ix) in [(0, 0), (2, 3)]: + overlay._on_indices(np.array([[ix, iy]])) + off = np.asarray(overlay._mg._data["offsets"], dtype=np.float64) + assert np.isfinite(off).all() + if len(off): + assert off.min() >= -0.5 and off.max() <= 32.5 finally: session.shutdown() @@ -87,7 +101,7 @@ def test_orientation_end_to_end_on_lazy_data(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_centered_diffraction_4d().as_lazy()) - time.sleep(0.3) + _settle(session) src_tree = session.signal_trees[0] assert src_tree.root._lazy is True # genuinely lazy src_plot = _signal_plot(session) @@ -106,33 +120,7 @@ def test_orientation_end_to_end_on_lazy_data(self): finally: session.shutdown() - def test_overlay_hook_registered_and_updates(self): - from spyde.backend.session import Session - from spyde.actions.orientation_action import run_orientation - session = Session(n_workers=1, threads_per_worker=1) - try: - session._add_signal(_centered_diffraction_4d()) - time.sleep(0.3) - src_tree = session.signal_trees[0] - src_plot = _signal_plot(session) - run_orientation( - session, src_tree.root, src_tree, [_make_phase()], - dict(accelerating_voltage=200.0, resolution=10.0), - dict(n_best=3, gamma=0.5), - src_dp_plot=src_plot, - ) - overlay = src_tree._orientation_overlay - # The hook is registered on a navigator selector (real-drag path). - sels = [s for s in src_tree.navigator_plot_manager.all_navigation_selectors - if overlay._on_indices in s.index_hooks] - assert sels, "overlay hook not registered on any navigator selector" - - # Moving to two positions both yield a valid (finite, in-frame) push. - for (iy, ix) in [(0, 0), (2, 3)]: - overlay._on_indices(np.array([[ix, iy]])) - off = np.asarray(overlay._mg._data["offsets"], dtype=np.float64) - assert np.isfinite(off).all() - if len(off): - assert off.min() >= -0.5 and off.max() <= 32.5 - finally: - session.shutdown() + # test_overlay_hook_registered_and_updates was folded into + # test_overlay_attaches_and_draws_template_spots: identical eager session + + # identical run_orientation(res=10) call, reading disjoint properties of + # the same overlay (hook registration + two more positions). diff --git a/spyde/tests/migrated/test_orientation_port.py b/spyde/tests/migrated/test_orientation_port.py index f2027af0..ed0a3b97 100644 --- a/spyde/tests/migrated/test_orientation_port.py +++ b/spyde/tests/migrated/test_orientation_port.py @@ -14,6 +14,7 @@ import hyperspy.api as hs import pytest +from spyde.tests.migrated.conftest import _settle def _make_phase(): @@ -43,7 +44,7 @@ def test_orientation_builds_ipf_window_and_attaches_map(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d()) - time.sleep(0.3) + _settle(session) src_tree = session.signal_trees[0] before = len(session.signal_trees) @@ -84,7 +85,7 @@ def test_source_overlay_attaches_before_the_batch(self, monkeypatch): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d()) - time.sleep(0.3) + _settle(session) src_tree = session.signal_trees[0] order: list[str] = [] @@ -111,13 +112,13 @@ def test_entry_rejects_missing_cif(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_diffraction_4d()) - time.sleep(0.3) + _settle(session) plot = next(p for p in session._plots if not p.is_navigator and p.plot_state is not None) before = len(session.signal_trees) ctx = ActionContext(plot=plot, params={}, action_name="Orientation Mapping") orientation_mapping(ctx, cif_path=None) - time.sleep(0.2) + _settle(session) assert len(session.signal_trees) == before # nothing created finally: session.shutdown() diff --git a/spyde/tests/migrated/test_orientation_wizard.py b/spyde/tests/migrated/test_orientation_wizard.py index 3369efa8..74a64ee7 100644 --- a/spyde/tests/migrated/test_orientation_wizard.py +++ b/spyde/tests/migrated/test_orientation_wizard.py @@ -16,6 +16,8 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle + CIF = os.path.join(os.path.dirname(__file__), "..", "Silver__0011135.cif") @@ -53,10 +55,17 @@ def test_generate_refine_run(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_calibrated_4d()) - time.sleep(0.4) + _settle(session) src = _signal_plot(session) tree = src.signal_tree + # ── Pre-generate: Compute Map without a library must error + # gracefully — no new tree ────────────────────────────────────── + before = len(session.signal_trees) + om_run(session, src, {"n_best": 3}) # no library generated + time.sleep(0.3) + assert len(session.signal_trees) == before # nothing created + # ── Generate Library (coarse resolution → quick) ───────────────── om_generate_library(session, src, { "cif_path": CIF, "accelerating_voltage": 200.0, @@ -93,17 +102,7 @@ def test_generate_refine_run(self): finally: session.shutdown() - def test_run_without_library_errors_gracefully(self): - from spyde.backend.session import Session - from spyde.actions.orientation_action import om_run - session = Session(n_workers=1, threads_per_worker=1) - try: - session._add_signal(_calibrated_4d()) - time.sleep(0.3) - src = _signal_plot(session) - before = len(session.signal_trees) - om_run(session, src, {"n_best": 3}) # no library generated - time.sleep(0.3) - assert len(session.signal_trees) == before # nothing created - finally: - session.shutdown() + # test_run_without_library_errors_gracefully was folded into + # test_generate_refine_run as its pre-generate stage: same session build, + # and the error path must run against a genuinely library-less tree, which + # is exactly the state before om_generate_library. diff --git a/spyde/tests/migrated/test_overlay_layers.py b/spyde/tests/migrated/test_overlay_layers.py index 086568ea..53503e41 100644 --- a/spyde/tests/migrated/test_overlay_layers.py +++ b/spyde/tests/migrated/test_overlay_layers.py @@ -19,6 +19,7 @@ import numpy as np from spyde.actions import overlay as ov +from spyde.tests.migrated.conftest import _settle # ── setup helpers ─────────────────────────────────────────────────────────────── @@ -48,7 +49,7 @@ def _two_signal_windows(session): mm = nav.multiplot_manager navpw = nav.plot_window mm.add_navigation_selector_and_signal_plot(navpw) - time.sleep(0.3) + _settle(session) _prime(session) sigs = sorted((p for p in session._plots if not p.is_navigator), key=lambda p: p.window_id) diff --git a/spyde/tests/migrated/test_overlay_visibility.py b/spyde/tests/migrated/test_overlay_visibility.py index 4237da69..f4fbb6e3 100644 --- a/spyde/tests/migrated/test_overlay_visibility.py +++ b/spyde/tests/migrated/test_overlay_visibility.py @@ -13,6 +13,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -50,7 +51,7 @@ def test_found_vectors_overlay_hides_on_deselect(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_calibrated_diffraction_4d(scale=0.1)) - time.sleep(0.4) + _settle(session) src_plot = _signal_plot(session) src_tree = src_plot.signal_tree @@ -96,7 +97,7 @@ def test_set_overlay_unknown_is_noop(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_calibrated_diffraction_4d(scale=0.1)) - time.sleep(0.3) + _settle(session) src_plot = _signal_plot(session) # No overlay yet / unknown action → must not raise. session._set_overlay(src_plot, "Find Diffraction Vectors", False) diff --git a/spyde/tests/migrated/test_playback.py b/spyde/tests/migrated/test_playback.py index 99c4d084..854e6e7b 100644 --- a/spyde/tests/migrated/test_playback.py +++ b/spyde/tests/migrated/test_playback.py @@ -136,9 +136,14 @@ def test_stops_at_last_frame_without_loop(self): def test_loop_wraps_to_start(self): pb, sel = _controller(n=6, scale=0.005, units="s") pb.play(loop=True) - time.sleep(0.4) + # Poll until the 6-frame movie has demonstrably wrapped (more fires + # than frames) instead of a flat 0.4 s window. + deadline = time.time() + 10.0 + while sel.fires <= 6 and time.time() < deadline: + time.sleep(0.02) looping = pb.is_playing pb.pause() + assert sel.fires > 6, "playback never wrapped the 6-frame movie" assert looping is True, "loop playback should still be running" # ── real-time pacing ──────────────────────────────────────────────────── diff --git a/spyde/tests/migrated/test_progressive_signal_preview.py b/spyde/tests/migrated/test_progressive_signal_preview.py index 64fb838f..c989b123 100644 --- a/spyde/tests/migrated/test_progressive_signal_preview.py +++ b/spyde/tests/migrated/test_progressive_signal_preview.py @@ -252,27 +252,16 @@ def counts(): assert counts() == (served, declined + 1) preview.close() - # KNOWN FLAKE, rerun rather than hidden. This paints a sample frame and then - # asserts the pixels landed. It fails intermittently on CI — 1 of 13 jobs on - # one run, 2 of 13 on another, on ubuntu-py3.10 and py3.13 alike while macOS - # and Windows py3.10 passed, so it is not a version issue — and reproduces - # on NO local run (12/12 standalone, full suite green). - # - # The mechanism it most likely hits: `lifecycle.paint_signal_plots` swallows - # a failed `set_data` at DEBUG, while the caller bumps `frames_painted` - # around the call — so a paint that raised leaves every counter claiming - # success and the pixels stale, which is exactly the observed shape - # (`frames_painted == 1` asserting fine, `current_data.max() == 0` failing). - # Raising that log to WARNING makes it diagnosable but is NOT free: the - # record streams to the renderer as an IPC message and breaks tests that - # assert on the captured message list. That is a deliberate change, not a - # de-flake, so it is tracked separately. - # - # `reruns` is deliberately not a fix. It keeps a transient from redding the - # ONE blocking job (the e2e lanes already carry retries:1 and - # continue-on-error; the Python matrix does not), while pytest still reports - # the rerun — so the flakiness stays visible instead of silently passing. - @pytest.mark.flaky(reruns=2, reruns_delay=1) + # Formerly a rerun-marked KNOWN FLAKE (1-2 of 13 CI jobs, never locally): + # it asserted the PIXELS right after note_block, while + # `lifecycle.paint_signal_plots` swallowed a failed `set_data` at DEBUG and + # the attempt counter incremented around the call — so a paint that did + # not land left `frames_painted == 1` asserting fine and + # `current_data.max() == 0` failing. paint_signal_plots now RETURNS the + # success count and the preview records it as `frames_landed`, so the test + # asserts the paint actually landed (deterministic: the paint runs inline + # in tests — no loop is registered) instead of inferring it from pixels a + # concurrent navigator repaint can race. def test_block_paints_a_sample_frame(self, window): """(a) — a landing block puts a frame on the signal plot.""" session = window["window"] @@ -290,9 +279,9 @@ def test_block_paints_a_sample_frame(self, window): assert preview.frames_painted == 1 assert preview.blocks_seen == 1 - sp = tree.signal_plots[0] - assert sp.current_data is not None - assert np.asarray(sp.current_data).max() > 0 + assert preview.frames_landed == 1, \ + "the sample paint's set_data did not land on the signal plot" + assert tree.signal_plots[0].current_data is not None preview.close() def test_sample_paints_are_throttled(self, window): @@ -391,11 +380,11 @@ def test_out_of_bounds_index_is_not_ready(self, window): # ── the Find-Vectors wiring ─────────────────────────────────────────────────── class TestFindVectorsWiring: - # Same known flake family as test_block_paints_a_sample_frame above (a paint - # that did not land while the counters say it did) — it failed on CI as "the - # landing block painted no frame" on the same runs. Reruns for the same - # reason: keep a transient out of the blocking job without hiding it. - @pytest.mark.flaky(reruns=2, reruns_delay=1) + # Formerly rerun-marked, same flake family as + # test_block_paints_a_sample_frame above (a paint that did not land while + # the counters said it did). Deflaked the same way: the assertion is now + # on the recorded set_data success count (`frames_landed`), not on the + # attempt counter. def test_batch_attaches_a_preview_and_feeds_it(self, stem_4d_dataset, monkeypatch): """``_start_batch`` must hand the compute an ``on_chunk_block`` that @@ -435,6 +424,7 @@ def fake_compute(src, p, **kw): captured["ready"] = preview.ready_count captured["frame"] = preview.slice_fn(None, None, [[1, 1]]) captured["painted"] = preview.frames_painted + captured["landed"] = preview.frames_landed captured["done"] = True return None # "no result" → no finalize, no error @@ -453,7 +443,9 @@ def fake_compute(src, p, **kw): assert captured["preview"] is not None, \ "the result window must get a live signal preview" assert captured["ready"] == (nav[0] - 1) * nav[1] - assert captured["painted"] >= 1, "the landing block painted no frame" + assert captured["painted"] >= 1, "the landing block attempted no paint" + assert captured["landed"] >= 1, \ + "the landing block's paint never landed (set_data failed/swallowed)" frame = captured["frame"] assert frame is not None and frame.shape == (sig_h, sig_w) assert frame[2, 3] == pytest.approx(5.0) diff --git a/spyde/tests/migrated/test_progressive_vi.py b/spyde/tests/migrated/test_progressive_vi.py index 3664effd..d2eacf90 100644 --- a/spyde/tests/migrated/test_progressive_vi.py +++ b/spyde/tests/migrated/test_progressive_vi.py @@ -13,6 +13,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -43,7 +44,7 @@ class TestVirtualImageDisplay: def test_eager_virtual_image_is_nonzero(self, window): session = window["window"] session._add_signal(_bright_4d()) # eager numpy - time.sleep(0.4) + _settle(session) src = _signal_plot(session) before = list(session._plots) session._dispatch_toolbar_action( @@ -58,7 +59,7 @@ def test_eager_virtual_image_is_nonzero(self, window): def test_lazy_virtual_image_is_nonzero(self, window): session = window["window"] session._add_signal(_bright_4d().as_lazy()) # lazy, no client → sync compute - time.sleep(0.4) + _settle(session) src = _signal_plot(session) before = list(session._plots) session._dispatch_toolbar_action( diff --git a/spyde/tests/migrated/test_region_extent_cap.py b/spyde/tests/migrated/test_region_extent_cap.py index ec46e692..ed6f6c99 100644 --- a/spyde/tests/migrated/test_region_extent_cap.py +++ b/spyde/tests/migrated/test_region_extent_cap.py @@ -7,14 +7,13 @@ clamp in _get_selected_indices bounds the index count even if the widget geometry wasn't clamped (e.g. a programmatic set). """ -import time - import numpy as np import hyperspy.api as hs from spyde.drawing.selectors.base_selector import ( DEFAULT_REGION_EXTENT_PER_DIM, MAX_REGION_EXTENT_PER_DIM, ) +from spyde.tests.migrated.conftest import _settle def _make_4d_session(): @@ -26,7 +25,7 @@ def _make_4d_session(): s.set_signal_type("electron_diffraction") sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) return sess @@ -37,7 +36,7 @@ def _make_movie_session(): np.random.RandomState(1).rand(64, 8, 8).astype(np.float32)) sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) return sess @@ -142,7 +141,7 @@ def _movie_session(scale=0.05, n=80): tax.name, tax.units, tax.scale = "time", "s", scale sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.7) + _settle(sess) return sess def test_first_integrate_gives_the_default_width_not_the_whole_axis(self): diff --git a/spyde/tests/migrated/test_report_line_panels.py b/spyde/tests/migrated/test_report_line_panels.py index c9a65185..de6544ea 100644 --- a/spyde/tests/migrated/test_report_line_panels.py +++ b/spyde/tests/migrated/test_report_line_panels.py @@ -25,6 +25,7 @@ from spyde.actions.report import compose as cx from spyde.actions.report import handlers as h from spyde.actions.report.model import FigureSpec +from spyde.tests.migrated.conftest import _settle # ── local fixture: a 1-D signal (no navigation) → one signal window ──────────── @@ -45,7 +46,7 @@ def signal1d_dataset(captured_messages): ax.name, ax.units, ax.scale, ax.offset = "Energy", "eV", 0.5, 0.0 s.metadata.set_item("General.title", "1D Curve") session._add_signal(s, source_path=None) - time.sleep(0.3) + _settle(session) yield {"window": session, "signal_trees": session.signal_trees, "plots": session._plots, "messages": captured_messages} session.shutdown() diff --git a/spyde/tests/migrated/test_report_orientation_embed.py b/spyde/tests/migrated/test_report_orientation_embed.py index 00066aa5..31cb08b7 100644 --- a/spyde/tests/migrated/test_report_orientation_embed.py +++ b/spyde/tests/migrated/test_report_orientation_embed.py @@ -18,18 +18,40 @@ from spyde.tests.migrated.test_ipf_3d import _al_orientation_map +_OM_CACHE = None +_PACKED = None + + def _om(ny=4, nx=5): - return _al_orientation_map(ny, nx) + """The default (4, 5) map is built ONCE for the module — every consumer + only reads it (pack_orientation / the explorer html take it as input), + and rebuilding re-ran the random-quat orix symmetry reduction per test. + Non-default shapes still build fresh.""" + global _OM_CACHE + if (ny, nx) != (4, 5): + return _al_orientation_map(ny, nx) + if _OM_CACHE is None: + _OM_CACHE = _al_orientation_map(4, 5) + return _OM_CACHE + + +def _packed(): + """pack_orientation(_om()) once (orix reduction x 4 directions) — shared + by the read-only payload consumers. Tests that monkeypatch the module's + cap/stride constants run their own pack_orientation call.""" + global _PACKED + if _PACKED is None: + from spyde.actions.report.orientation_embed import pack_orientation + _PACKED = pack_orientation(_om()) + return _PACKED class TestPackOrientation: def test_payload_roundtrip(self): - from spyde.actions.report.orientation_embed import ( - DIRECTIONS, pack_orientation, - ) + from spyde.actions.report.orientation_embed import DIRECTIONS om = _om() - payload = pack_orientation(om) + payload = _packed() assert payload is not None hdr = payload["header"] assert hdr["nav"] == [4, 5] @@ -65,10 +87,8 @@ def test_rows_are_nav_positions(self): """Row i of every array is flat nav index i — the whole contract the crosshair pick rests on. Checked against the app's own per-position accessor rather than against the packing code's arithmetic.""" - from spyde.actions.report.orientation_embed import pack_orientation - om = _om(4, 5) - payload = pack_orientation(om) + payload = _packed() m = payload["header"]["m"] _rgb, xy, xyz = payload["arrays"]["z"] nx = payload["header"]["nav"][1] @@ -173,7 +193,7 @@ def test_density_images_are_png_urls_not_raw_bytes(self): from spyde.actions.report.orientation_embed import ( DIRECTIONS, pack_orientation, ) - rec = pack_orientation(_om())["header"]["phases"][0] + rec = _packed()["header"]["phases"][0] for key in ("raster", "texture"): assert set(rec[key]) == set(DIRECTIONS), key for url in rec[key].values(): @@ -207,8 +227,10 @@ def test_swapped_result_identity_rebuilds(self): orientation_explorer_html, ) self._clear() - a = orientation_explorer_html(_om(), cache_key="c1") - b = orientation_explorer_html(_om(), cache_key="c1") + # Two genuinely DISTINCT map objects (the module memo would hand back + # one identity, which is the opposite of what this test needs). + a = orientation_explorer_html(_al_orientation_map(4, 5), cache_key="c1") + b = orientation_explorer_html(_al_orientation_map(4, 5), cache_key="c1") assert a is not b def test_no_cache_key_never_memoizes(self): diff --git a/spyde/tests/migrated/test_roi_trace.py b/spyde/tests/migrated/test_roi_trace.py index 3c687803..32de0032 100644 --- a/spyde/tests/migrated/test_roi_trace.py +++ b/spyde/tests/migrated/test_roi_trace.py @@ -13,6 +13,7 @@ from spyde.drawing.selectors.base_selector import MAX_REGION_EXTENT_PER_DIM from spyde.drawing.selectors.roi_trace import RoiTrace +from spyde.tests.migrated.conftest import _settle def _jump_records(caplog): @@ -170,7 +171,7 @@ def _movie_session(): tax.name, tax.units, tax.scale = "time", "s", 0.05 sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.8) + _settle(sess) return sess def test_sliding_an_established_span_is_quiet(self, caplog): diff --git a/spyde/tests/migrated/test_scale_bar.py b/spyde/tests/migrated/test_scale_bar.py index b388b167..f70b790c 100644 --- a/spyde/tests/migrated/test_scale_bar.py +++ b/spyde/tests/migrated/test_scale_bar.py @@ -5,6 +5,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _panel_units(messages): @@ -29,7 +30,7 @@ def test_physical_units_reach_panel_state(self, captured_messages): ax.scale = 0.5 sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.8) + _settle(sess) sess.shutdown() units = _panel_units(captured_messages) @@ -44,7 +45,7 @@ def test_pixel_units_give_no_scale(self, captured_messages): s = hs.signals.Signal2D(np.random.RandomState(1).rand(16, 16).astype(np.float32)) sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) sess.shutdown() units = _panel_units(captured_messages) diff --git a/spyde/tests/migrated/test_selector_close_cleanup.py b/spyde/tests/migrated/test_selector_close_cleanup.py index e3cf410a..9a1964dc 100644 --- a/spyde/tests/migrated/test_selector_close_cleanup.py +++ b/spyde/tests/migrated/test_selector_close_cleanup.py @@ -14,6 +14,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _nav_wid(session): @@ -146,7 +147,7 @@ def test_second_selector_survives_closing_first_signal_window( # Second signal window + selector off the SAME navigator (the # add_selector toolbar action's body — see spyde.actions.base). mm.add_navigation_selector_and_signal_plot(navpw) - time.sleep(0.3) + _settle(session) sels = list(mm.navigation_selectors[navpw]) assert len(sels) == 2, "expected two selectors on the navigator" @@ -212,7 +213,7 @@ def _make_5d_session(): s.set_signal_type("electron_diffraction") sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) return sess diff --git a/spyde/tests/migrated/test_selector_mode.py b/spyde/tests/migrated/test_selector_mode.py index e5a58ef4..a39acfe4 100644 --- a/spyde/tests/migrated/test_selector_mode.py +++ b/spyde/tests/migrated/test_selector_mode.py @@ -7,6 +7,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _make_4d_session(): @@ -15,7 +16,7 @@ def _make_4d_session(): s.set_signal_type("electron_diffraction") sess = Session(n_workers=1, threads_per_worker=1) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) return sess @@ -63,7 +64,7 @@ def test_the_1d_composite_shares_with_both_sub_selectors(self): s = hs.signals.Signal2D( np.random.RandomState(0).rand(6, 8, 8).astype(np.float32)) sess._add_signal(s, source_path=None) - time.sleep(0.6) + _settle(sess) comp = next(iter(sess._nav_selectors.values())) assert comp.children is comp._inf_line_selector.children assert comp.children is comp._linear_region_selector.children diff --git a/spyde/tests/migrated/test_signal_type.py b/spyde/tests/migrated/test_signal_type.py index 1655b7fa..ab7a2ea2 100644 --- a/spyde/tests/migrated/test_signal_type.py +++ b/spyde/tests/migrated/test_signal_type.py @@ -11,6 +11,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _make_session(): @@ -29,7 +30,7 @@ def test_load_emits_signal_type_info(self, captured_messages, monkeypatch): try: s = hs.signals.Signal2D(np.zeros((8, 8), dtype=np.float32)) session._add_signal(s, source_path=None) - time.sleep(0.4) + _settle(session) info = _msgs(captured_messages, "signal_type_info") assert info, "no signal_type_info emitted on load" assert info[-1]["current"] == "" # generic Signal2D @@ -43,12 +44,12 @@ def test_set_signal_type_recasts_and_reemits(self, captured_messages, monkeypatc try: s = hs.signals.Signal2D(np.zeros((4, 4, 8, 8), dtype=np.float32)) session._add_signal(s, source_path=None) - time.sleep(0.4) + _settle(session) captured_messages.clear() plot = session._plots[-1] session._set_signal_type(plot, "electron_diffraction") - time.sleep(0.3) + _settle(session) tree = session.signal_trees[-1] assert tree.root.metadata.get_item("Signal.signal_type") == "electron_diffraction" @@ -65,11 +66,11 @@ def test_set_empty_type_reverts_to_generic(self, captured_messages, monkeypatch) s = hs.signals.Signal2D(np.zeros((4, 4, 8, 8), dtype=np.float32)) s.set_signal_type("electron_diffraction") session._add_signal(s, source_path=None) - time.sleep(0.4) + _settle(session) plot = session._plots[-1] session._set_signal_type(plot, "") - time.sleep(0.3) + _settle(session) assert (session.signal_trees[-1].root.metadata.get_item( "Signal.signal_type", default="") or "") == "" finally: diff --git a/spyde/tests/migrated/test_template_actions.py b/spyde/tests/migrated/test_template_actions.py index e0c28323..5ad4159f 100644 --- a/spyde/tests/migrated/test_template_actions.py +++ b/spyde/tests/migrated/test_template_actions.py @@ -1,5 +1,6 @@ """Toolbar actions on the host-agnostic template must run end-to-end.""" import time +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -14,7 +15,7 @@ def _run(session, messages, name, params): plot = _signal_plot(session) assert plot is not None, "no signal plot" session._dispatch_toolbar_action(plot, name, params) - time.sleep(0.5) + _settle(session) opened = [m for m in messages if m.get("type") == "window_opened"] errors = [m.get("text") for m in messages if m.get("type") == "error"] return opened, errors diff --git a/spyde/tests/migrated/test_tutorial_data.py b/spyde/tests/migrated/test_tutorial_data.py index 67e40688..41b26d12 100644 --- a/spyde/tests/migrated/test_tutorial_data.py +++ b/spyde/tests/migrated/test_tutorial_data.py @@ -19,6 +19,7 @@ import pytest from spyde.backend.tutorial_data import TUTORIAL_LOADERS +from spyde.tests.migrated.conftest import _settle def _last_tree(session): @@ -26,10 +27,16 @@ def _last_tree(session): return session.signal_trees[-1] -def _settle(): - # Let selector/navigator debounce timers + the (threaded, no-dask) compute - # settle before asserting — mirrors conftest._load's own sleep. - time.sleep(0.5) +def _wait_trees(session, n, timeout=5.0): + """Poll for the signal-tree count after a close — conftest._settle can't + serve there (it waits for painted plots, and a full teardown leaves + none).""" + end = time.monotonic() + timeout + while time.monotonic() < end: + if len(session.signal_trees) == n: + return True + time.sleep(0.01) + return len(session.signal_trees) == n class TestTutorialLoadersDirect: @@ -38,7 +45,7 @@ class TestTutorialLoadersDirect: def test_navigation_shape(self, window): session = window["window"] session.tutorial_navigation() - _settle() + _settle(session) tree = _last_tree(session) root = tree.root am = root.axes_manager @@ -59,7 +66,7 @@ def test_navigation_shape(self, window): def test_find_vectors_shape(self, window): session = window["window"] session.tutorial_find_vectors() - _settle() + _settle(session) tree = _last_tree(session) am = tree.root.axes_manager assert tuple(am.navigation_shape) == (6, 6) @@ -69,7 +76,7 @@ def test_find_vectors_shape(self, window): def test_orientation_shape(self, window): session = window["window"] session.tutorial_orientation() - _settle() + _settle(session) tree = _last_tree(session) am = tree.root.axes_manager assert tuple(am.navigation_shape) == (6, 6) @@ -79,7 +86,7 @@ def test_orientation_shape(self, window): def test_multiphase_shape(self, window): session = window["window"] session.tutorial_multiphase() - _settle() + _settle(session) tree = _last_tree(session) am = tree.root.axes_manager assert tuple(am.navigation_shape) == (20, 20) @@ -92,7 +99,7 @@ def test_strain_shape_is_bounded(self, window): loader MUST use the small (16,16)/(128,128)/1e3 override.""" session = window["window"] session.tutorial_strain() - _settle() + _settle(session) tree = _last_tree(session) am = tree.root.axes_manager assert tuple(am.navigation_shape) == (16, 16) @@ -108,7 +115,7 @@ def test_strain_shape_is_bounded(self, window): def test_spectroscopy_shape(self, window): session = window["window"] session.tutorial_spectroscopy() - _settle() + _settle(session) tree = _last_tree(session) root = tree.root am = root.axes_manager @@ -122,7 +129,7 @@ def test_spectroscopy_shape(self, window): def test_movie_shape_is_small_and_insitu(self, window): session = window["window"] session.tutorial_movie() - _settle() + _settle(session) tree = _last_tree(session) root = tree.root am = root.axes_manager @@ -154,34 +161,29 @@ def test_dispatch_unknown_name_emits_error(self, window): errors = [m for m in messages if m.get("type") == "error"] assert errors, "expected an error message for an unknown tutorial name" - def test_dispatch_navigation_by_name(self, window): - session = window["window"] - session.dispatch_action( - {"action": "tutorial_load", "payload": {"name": "navigation"}} - ) - _settle() - tree = _last_tree(session) - assert tuple(tree.root.axes_manager.navigation_shape) == (10, 10) - def test_repeat_load_is_idempotent(self, window): """Loading the SAME tutorial name twice must NOT stack a duplicate copy (the walkthrough double/triple-load fix) — the second dispatch is a no-op - because that dataset is already open.""" + because that dataset is already open. The first load doubles as the + dispatch-by-name check (identical dispatch), so the nav-shape assert + rides it.""" session = window["window"] n0 = len(session.signal_trees) session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "navigation"}}) - _settle() + _settle(session) assert len(session.signal_trees) == n0 + 1 + tree = _last_tree(session) + assert tuple(tree.root.axes_manager.navigation_shape) == (10, 10) # Second load of the same name → no new tree. session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "navigation"}}) - _settle() + _settle(session) assert len(session.signal_trees) == n0 + 1 # A DIFFERENT tutorial name still loads (dedup is per-name, not global). session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "spectroscopy"}}) - _settle() + _settle(session) assert len(session.signal_trees) == n0 + 2 def test_close_all_tears_down_tutorial_trees(self, window): @@ -190,18 +192,17 @@ def test_close_all_tears_down_tutorial_trees(self, window): session = window["window"] # A non-tutorial dataset the close must NOT touch. session.dispatch_action({"action": "load_test_data", "payload": {}}) - _settle() + _settle(session) keep = len(session.signal_trees) session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "navigation"}}) session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "spectroscopy"}}) - _settle() + _settle(session) assert len(session.signal_trees) == keep + 2 # Close all tutorial trees → back to just the non-tutorial dataset. session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) - _settle() - assert len(session.signal_trees) == keep + assert _wait_trees(session, keep) # A second close is a harmless no-op. session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) assert len(session.signal_trees) == keep @@ -229,7 +230,7 @@ def test_dispatch_works_under_simulated_packaged_env(self, window, monkeypatch): session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "spectroscopy"}} ) - _settle() + _settle(session) tree = _last_tree(session) assert tuple(tree.root.axes_manager.signal_shape) == (1024,) @@ -269,18 +270,17 @@ def test_derived_result_windows_are_closed_too(self, window): session.dispatch_action({"action": "tutorial_session_begin", "payload": {}}) session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "navigation"}}) - _settle() + _settle(session) # …and now the walkthrough runs an analysis, which opens a result tree. derived = self._derived(session) - _settle() + _settle(session) assert len(session.signal_trees) == keep + 2 assert derived in session.signal_trees session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) - _settle() # BOTH the tutorial dataset and the derived result are gone. + assert _wait_trees(session, keep) assert derived not in session.signal_trees - assert len(session.signal_trees) == keep def test_only_active_session_records(self, window): """Outside a session (`tutorial_session_begin` never sent, or already @@ -288,10 +288,10 @@ def test_only_active_session_records(self, window): can't reach back and close a window the user made on their own.""" session = window["window"] before = self._derived(session) - _settle() + _settle(session) n = len(session.signal_trees) session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) - _settle() + _settle(session) assert before in session.signal_trees assert len(session.signal_trees) == n @@ -306,11 +306,11 @@ def test_user_file_backed_tree_is_never_closed(self, window, tmp_path): session.dispatch_action({"action": "tutorial_session_begin", "payload": {}}) session.dispatch_action( {"action": "tutorial_load", "payload": {"name": "navigation"}}) - _settle() + _settle(session) mine = session._add_signal(hs.load(str(path)), source_path=str(path)) - _settle() + _settle(session) session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) - _settle() + _settle(session) assert mine in session.signal_trees def test_close_all_ends_the_session(self, window): @@ -320,7 +320,7 @@ def test_close_all_ends_the_session(self, window): session.dispatch_action({"action": "tutorial_session_begin", "payload": {}}) session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) after = self._derived(session) - _settle() + _settle(session) session.dispatch_action({"action": "tutorial_close_all", "payload": {}}) - _settle() + _settle(session) assert after in session.signal_trees diff --git a/spyde/tests/migrated/test_vector_orientation.py b/spyde/tests/migrated/test_vector_orientation.py index 34e00346..ee4013e5 100644 --- a/spyde/tests/migrated/test_vector_orientation.py +++ b/spyde/tests/migrated/test_vector_orientation.py @@ -474,8 +474,13 @@ def _ag_lib(self): Atom("Ag", [.5, 0, .5]), Atom("Ag", [0, .5, .5])] phase = Phase(name="Ag", point_group="m-3m", structure=Structure(atoms, latt)) + # resolution 4.0 (91 beam directions, ~5 s) rather than 2.0 (300, + # ~15 s): the generating template below is still a library member and + # the test already tolerates a symmetry-equivalent coarse pick — the + # asserts are on the fit residual + strain cap, not on which template + # the coarse seed lands on. sim = generate_library_from_phases( - [phase], accelerating_voltage=200.0, resolution=2.0, + [phase], accelerating_voltage=200.0, resolution=4.0, minimum_intensity=1e-3, reciprocal_radius=0.75, ) cal = hs.signals.Signal2D(np.zeros((112, 112), np.float32)) diff --git a/spyde/tests/migrated/test_vector_orientation_gpu.py b/spyde/tests/migrated/test_vector_orientation_gpu.py index e2ee15cf..2b49c28d 100644 --- a/spyde/tests/migrated/test_vector_orientation_gpu.py +++ b/spyde/tests/migrated/test_vector_orientation_gpu.py @@ -8,7 +8,11 @@ Harness note: torch's CUDA autograd backward segfaults when run *inside* the pytest process on Windows (a pytest/torch interaction — the same compute runs correctly in plain Python and in the real app, alongside QApplication + Dask). -So each test runs the compute in a **subprocess** and checks its JSON result. +So ONE subprocess runs all three modes sequentially (each fresh subprocess +pays interpreter + torch import + cold CUDA init, ~5-7 s) and prints one +tagged ``RESULT_JSON {...}`` line per mode; the tests keep their +separate assertions on the parsed results. The driver hard-exits after +printing, so partially-emitted results survive a teardown crash. Skipped entirely when CUDA / torch GPU is unavailable. """ import json @@ -24,11 +28,23 @@ not gpu_available(), reason="CUDA / torch GPU not available") -# Driver script body shared by the subprocesses. Builds synthetic vectors + -# a single-template library, runs the batched GPU fit, prints a JSON summary. +# Driver script run ONCE in a subprocess. Builds synthetic vectors + a +# single-template library, runs the batched GPU fit for every mode given on +# argv, prints one tagged JSON summary line per mode. _DRIVER = textwrap.dedent(""" import json, sys import numpy as np + + # Prime cublasLt with a tiny F.linear BEFORE any other GPU work: on Pascal + # (torch cu124) the FIRST cublasLt init that happens after cuDNN conv work + # fails with CUBLAS_STATUS_NOT_INITIALIZED — a long multi-mode process is + # exactly where that ordering can arise. + import torch + if torch.cuda.is_available(): + import torch.nn.functional as F + F.linear(torch.zeros(1, 1, device="cuda"), + torch.zeros(1, 1, device="cuda")) + torch.cuda.synchronize() from spyde.actions import vector_orientation as vo from spyde.actions.vector_orientation_gpu import compute_vector_orientation_gpu from spyde.signals.diffraction_vectors import ( @@ -69,62 +85,74 @@ class Ax: full_nav_shape=(ny, nx), sig_shape=(32, 32), sig_axes=[Ax(), Ax()], kernel_radius_px=3.0, kernel_radius_data=0.03) - mode = sys.argv[1] - out = {} - if mode == "strain": - E = np.array([[0.015, 0.005],[0.005,-0.010]], np.float32) - res = compute_vector_orientation_gpu( - make_vecs(strain=E), stub_library(), - {"strain_cap":0.05,"sink_bw":0.04}, t=None) - out["exx"]=float(np.nanmedian(res.strain[...,0])) - out["eyy"]=float(np.nanmedian(res.strain[...,1])) - out["exy"]=float(np.nanmedian(res.strain[...,2])) - out["finite"]=bool(np.isfinite(res.strain[...,0]).all()) - out["nav"]=list(res.nav_shape) - elif mode == "stop": - res = compute_vector_orientation_gpu( - make_vecs(), stub_library(), {"strain_cap":0.05,"sink_bw":0.04}, - t=None, stopped_flag=[True]) - out["is_none"]= res is None - elif mode == "progress": - # Use multiprocessing shared_memory directly — importing the GUI - # helpers (spyde.drawing.update_functions) pulls in pyqtgraph/Qt, which - # is unsafe to combine with torch CUDA in this same process. - from multiprocessing import shared_memory - sh = shared_memory.SharedMemory(create=True, size=4*4*12*4) - buf = np.ndarray((4,4,12), np.float32, buffer=sh.buf); buf[:] = np.nan - seen=[] - res = compute_vector_orientation_gpu( - make_vecs(), stub_library(), {"strain_cap":0.05,"sink_bw":0.04}, - t=None, progress=lambda d,t: seen.append((d,t)), - shm_name=sh.name) - out["reached_100"]= bool(seen and seen[-1][0]==seen[-1][1]) - out["buf_painted"]= bool(np.isfinite(buf[...,9]).any()) - out["not_none"]= res is not None - sh.close(); sh.unlink() - - print("RESULT_JSON", json.dumps(out)) - sys.stdout.flush() + def run_mode(mode): + out = {} + if mode == "strain": + E = np.array([[0.015, 0.005],[0.005,-0.010]], np.float32) + res = compute_vector_orientation_gpu( + make_vecs(strain=E), stub_library(), + {"strain_cap":0.05,"sink_bw":0.04}, t=None) + out["exx"]=float(np.nanmedian(res.strain[...,0])) + out["eyy"]=float(np.nanmedian(res.strain[...,1])) + out["exy"]=float(np.nanmedian(res.strain[...,2])) + out["finite"]=bool(np.isfinite(res.strain[...,0]).all()) + out["nav"]=list(res.nav_shape) + elif mode == "stop": + res = compute_vector_orientation_gpu( + make_vecs(), stub_library(), {"strain_cap":0.05,"sink_bw":0.04}, + t=None, stopped_flag=[True]) + out["is_none"]= res is None + elif mode == "progress": + # Use multiprocessing shared_memory directly — importing the GUI + # helpers (spyde.drawing.update_functions) pulls in pyqtgraph/Qt, which + # is unsafe to combine with torch CUDA in this same process. + from multiprocessing import shared_memory + sh = shared_memory.SharedMemory(create=True, size=4*4*12*4) + buf = np.ndarray((4,4,12), np.float32, buffer=sh.buf); buf[:] = np.nan + seen=[] + res = compute_vector_orientation_gpu( + make_vecs(), stub_library(), {"strain_cap":0.05,"sink_bw":0.04}, + t=None, progress=lambda d,t: seen.append((d,t)), + shm_name=sh.name) + out["reached_100"]= bool(seen and seen[-1][0]==seen[-1][1]) + out["buf_painted"]= bool(np.isfinite(buf[...,9]).any()) + out["not_none"]= res is not None + sh.close(); sh.unlink() + return out + + for mode in sys.argv[1:]: + print("RESULT_JSON", mode, json.dumps(run_mode(mode))) + sys.stdout.flush() # torch + CUDA + shared-memory teardown segfaults at interpreter exit on # Windows (harmless, post-result). Hard-exit so the parent sees rc==0. import os os._exit(0) """) +_MODES = ("strain", "progress", "stop") + -def _run(mode): - """Run the driver in a subprocess; return the parsed JSON result dict.""" +@pytest.fixture(scope="module") +def gpu_results(): + """Run the driver once for all modes; return {mode: parsed JSON dict}.""" proc = subprocess.run( - [sys.executable, "-c", _DRIVER, mode], - capture_output=True, text=True, timeout=300) + [sys.executable, "-c", _DRIVER, *_MODES], + capture_output=True, text=True, timeout=600) assert proc.returncode == 0, ( f"subprocess failed ({proc.returncode}):\n{proc.stdout}\n{proc.stderr}") - line = next(l for l in proc.stdout.splitlines() if l.startswith("RESULT_JSON")) - return json.loads(line[len("RESULT_JSON "):]) - - -def test_gpu_recovers_known_strain(): - out = _run("strain") + results = {} + for line in proc.stdout.splitlines(): + if line.startswith("RESULT_JSON "): + _tag, mode, payload = line.split(" ", 2) + results[mode] = json.loads(payload) + missing = [m for m in _MODES if m not in results] + assert not missing, ( + f"driver emitted no result for {missing}:\n{proc.stdout}\n{proc.stderr}") + return results + + +def test_gpu_recovers_known_strain(gpu_results): + out = gpu_results["strain"] assert out["nav"] == [4, 4] assert out["finite"] assert abs(out["exx"] - 0.015) < 5e-3, out @@ -132,13 +160,13 @@ def test_gpu_recovers_known_strain(): assert abs(out["exy"] - 0.005) < 5e-3, out -def test_gpu_progress_and_shm_preview(): - out = _run("progress") +def test_gpu_progress_and_shm_preview(gpu_results): + out = gpu_results["progress"] assert out["not_none"] assert out["reached_100"] assert out["buf_painted"] -def test_gpu_stop_flag_aborts(): - out = _run("stop") +def test_gpu_stop_flag_aborts(gpu_results): + out = gpu_results["stop"] assert out["is_none"] diff --git a/spyde/tests/migrated/test_vector_orientation_om.py b/spyde/tests/migrated/test_vector_orientation_om.py index 20fbe02c..e55113dd 100644 --- a/spyde/tests/migrated/test_vector_orientation_om.py +++ b/spyde/tests/migrated/test_vector_orientation_om.py @@ -17,6 +17,8 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle + CIF = os.path.join(os.path.dirname(__file__), "..", "Silver__0011135.cif") @@ -57,7 +59,7 @@ def _multi_disk_4d(nav=(3, 3), sig=(48, 48), scale=0.05): def _make_vectors_tree(session): session._add_signal(_multi_disk_4d()) - time.sleep(0.4) + _settle(session) src = next((p for p in session._plots if not p.is_navigator and p.plot_state is not None), None) session._dispatch_toolbar_action( @@ -86,6 +88,14 @@ def test_generate_then_run(self, monkeypatch): vplot = _signal_plot(session, vtree) assert vplot is not None + # ── Pre-generate: Compute Maps without a library must error + # gracefully — no new tree (the natural staged-wizard ordering, + # so it runs against a genuinely library-less tree) ─────────── + before = len(session.signal_trees) + vom_run(session, vplot, {"strain_cap": 0.05}) # no library yet + time.sleep(0.4) + assert len(session.signal_trees) == before + # ── Generate Library (coarse resolution → quick) ──────────────── vom_generate_library(session, vplot, { "cif_path": CIF, "accelerating_voltage": 200.0, @@ -96,6 +106,22 @@ def test_generate_then_run(self, monkeypatch): "template library never built" assert len(vtree._vom_wizard.lib.spots_xy) > 0 + # ── Generate also activates the live refine overlay ───────────── + assert _wait(lambda: vtree._vom_wizard.overlay is not None), \ + "live refine overlay never attached" + ov = vtree._vom_wizard.overlay + # Two marker groups: measured (red) + fitted template (green). + assert ov._mg_meas is not None and ov._mg_tmpl is not None + # At a position with ≥4 vectors: measured points drawn, template + # fit too. + vecs = vtree.diffraction_vectors + cm = vecs.count_map() + ys, xs = np.nonzero(cm >= 4) + if len(ys): + meas, tmpl = ov._offsets_for(int(ys[0]), int(xs[0])) + assert meas.shape[0] >= 4 + assert tmpl.shape[1] == 2 # a fitted template was produced + # Generate now ALSO fits the whole field and opens the live IPF # heatmap window (Qt parity — the orientation map appears while you # refine, before Compute Maps). @@ -144,33 +170,12 @@ def _strain_sp(): finally: session.shutdown() - def test_generate_activates_live_refine_overlay(self): - from spyde.backend.session import Session - from spyde.actions.vector_orientation_om import vom_generate_library - session = Session(n_workers=1, threads_per_worker=1) - try: - vtree = _make_vectors_tree(session) - vplot = _signal_plot(session, vtree) - vom_generate_library(session, vplot, { - "cif_path": CIF, "accelerating_voltage": 200.0, - "resolution": 12.0, "minimum_intensity": 1e-4, - }) - assert _wait(lambda: getattr(vtree, "_vom_wizard", None) is not None - and vtree._vom_wizard.overlay is not None), \ - "live refine overlay never attached" - ov = vtree._vom_wizard.overlay - # Two marker groups: measured (red) + fitted template (green). - assert ov._mg_meas is not None and ov._mg_tmpl is not None - # At a position with ≥4 vectors: measured points drawn, template fit too. - vecs = vtree.diffraction_vectors - cm = vecs.count_map() - ys, xs = np.nonzero(cm >= 4) - if len(ys): - meas, tmpl = ov._offsets_for(int(ys[0]), int(xs[0])) - assert meas.shape[0] >= 4 - assert tmpl.shape[1] == 2 # a fitted template was produced - finally: - session.shutdown() + # test_generate_activates_live_refine_overlay and + # test_run_without_library_errors_gracefully were folded into + # test_generate_then_run above: they re-ran the identical + # _make_vectors_tree + vom_generate_library flow to read other properties + # of the same wizard (and the overlay variant did not force the CPU fit, + # so its background field fit could hit CUDA in-process on dev boxes). def test_fit_field_prefers_gpu_then_falls_back(self, monkeypatch): """`_fit_field` must dispatch the BATCHED GPU path first (Qt parity — the @@ -209,16 +214,3 @@ class _Vecs: assert vom._fit_field(_Vecs(), object(), {}) == "CPU_RESULT" assert calls == ["cpu"] - def test_run_without_library_errors_gracefully(self): - from spyde.backend.session import Session - from spyde.actions.vector_orientation_om import vom_run - session = Session(n_workers=1, threads_per_worker=1) - try: - vtree = _make_vectors_tree(session) - vplot = _signal_plot(session, vtree) - before = len(session.signal_trees) - vom_run(session, vplot, {"strain_cap": 0.05}) # no library yet - time.sleep(0.4) - assert len(session.signal_trees) == before - finally: - session.shutdown() diff --git a/spyde/tests/migrated/test_vector_overlay.py b/spyde/tests/migrated/test_vector_overlay.py index 4a197ecf..6e17fb1e 100644 --- a/spyde/tests/migrated/test_vector_overlay.py +++ b/spyde/tests/migrated/test_vector_overlay.py @@ -19,6 +19,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -57,7 +58,7 @@ def test_overlay_attached_with_pixel_offsets(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_calibrated_diffraction_4d(scale=0.1), source_path=None) - time.sleep(0.4) + _settle(session) src_plot = _signal_plot(session) src_tree = src_plot.signal_tree @@ -103,7 +104,7 @@ def test_overlay_updates_when_navigator_moves(self): session = Session(n_workers=1, threads_per_worker=1) try: session._add_signal(_calibrated_diffraction_4d(scale=0.1), source_path=None) - time.sleep(0.4) + _settle(session) src_plot = _signal_plot(session) src_tree = src_plot.signal_tree session._dispatch_toolbar_action( diff --git a/spyde/tests/migrated/test_vector_virtual_imaging.py b/spyde/tests/migrated/test_vector_virtual_imaging.py index ce1d0e96..f07e493c 100644 --- a/spyde/tests/migrated/test_vector_virtual_imaging.py +++ b/spyde/tests/migrated/test_vector_virtual_imaging.py @@ -16,6 +16,7 @@ import numpy as np import hyperspy.api as hs +from spyde.tests.migrated.conftest import _settle def _signal_plot(session, tree): @@ -51,7 +52,7 @@ def _calibrated_diffraction_4d(nav=(4, 5), sig=(24, 24), scale=0.1): def _make_vectors_tree(session): """Run Find Vectors and return the resulting vectors-image tree.""" session._add_signal(_calibrated_diffraction_4d(scale=0.1)) - time.sleep(0.4) + _settle(session) src_plot = next((p for p in session._plots if not p.is_navigator and p.plot_state is not None), None) session._dispatch_toolbar_action( diff --git a/spyde/tests/migrated/test_vector_vvi_action.py b/spyde/tests/migrated/test_vector_vvi_action.py index 62887ed3..71b0a998 100644 --- a/spyde/tests/migrated/test_vector_vvi_action.py +++ b/spyde/tests/migrated/test_vector_vvi_action.py @@ -15,6 +15,7 @@ from spyde.actions.find_vectors import _do_compute_vectors from spyde.drawing.toolbars.plot_control_toolbar import get_toolbar_actions_for_plot +from spyde.tests.migrated.conftest import _settle def _params(): @@ -328,7 +329,7 @@ def _vectors_result_tree(self, session): ax.scale, ax.offset = 0.01, -32 * 0.005 tree = session._add_signal(root) tree.diffraction_vectors = vecs - time.sleep(0.6) + _settle(session) return tree, vecs def test_add_vvi_spawns_navigable_3d_tree(self, window): @@ -341,7 +342,7 @@ def test_add_vvi_spawns_navigable_3d_tree(self, window): sig_plot = next(p for p in tree.signal_plots) ctx = ActionContext(plot=sig_plot, params={}, action_name="Add Vector Virtual Image") add_vector_virtual_image(ctx, type="disk", calculation="intensity") - import time; time.sleep(0.6) + _settle(session) # A new signal tree was spawned for the VI result … assert len(session.signal_trees) == n_trees_before + 1 @@ -365,7 +366,7 @@ def test_roi_move_recomputes_full_stack(self, window): sig_plot = next(p for p in tree.signal_plots) ctx = ActionContext(plot=sig_plot, params={}, action_name="Add Vector Virtual Image") add_vector_virtual_image(ctx, type="disk", calculation="intensity") - import time; time.sleep(0.6) + _settle(session) vi_tree = session.signal_trees[-1] act = next(v["action"] for v in session._action_artifacts.values() @@ -383,7 +384,7 @@ def test_roi_move_recomputes_full_stack(self, window): out = act.reduce_to(act.signal, act._selector, None, None, calculation="intensity") assert out is None # tree navigator owns the slice - time.sleep(0.3) + _settle(session) data = np.asarray(vi_tree.root.data) assert data.shape == (vecs.n_time, *vecs.nav_shape) assert data.sum() > 0 # the moved ROI now picks up spots diff --git a/spyde/tests/migrated/test_virtual_imaging.py b/spyde/tests/migrated/test_virtual_imaging.py index 099fb34d..6557c0b5 100644 --- a/spyde/tests/migrated/test_virtual_imaging.py +++ b/spyde/tests/migrated/test_virtual_imaging.py @@ -9,6 +9,7 @@ from __future__ import annotations import time +from spyde.tests.migrated.conftest import _settle def _signal_plot(session): @@ -23,7 +24,7 @@ def _sub_items(msgs): def _add_vi(session, src): session._dispatch_toolbar_action( src, "add_virtual_image", {"type": "disk", "calculation": "mean"}) - time.sleep(0.3) + _settle(session) class TestVirtualImagingSubToolbar: @@ -71,7 +72,7 @@ def test_update_vi_applies_caret_params_live(self, stem_4d_dataset): "action": "update_vi", "window_id": src.window_id, "payload": {"name": vi["name"], "params": {"calculation": "sum"}}, }) - time.sleep(0.2) + _settle(session) # The VI's live params changed (so the next recompute uses them) and the # chip is re-emitted with the new value. @@ -95,7 +96,7 @@ def test_type_change_rebuilds_the_roi_shape(self, stem_4d_dataset): "action": "update_vi", "window_id": src.window_id, "payload": {"name": vi["name"], "params": {"type": "annular"}}, }) - time.sleep(0.2) + _settle(session) assert isinstance(art["action"]._selector, AnnularSelector) assert art["action"]._selector is not old_sel assert art["selector"] is art["action"]._selector # removal ref refreshed @@ -106,7 +107,7 @@ def test_type_change_rebuilds_the_roi_shape(self, stem_4d_dataset): "action": "update_vi", "window_id": src.window_id, "payload": {"name": vi["name"], "params": {"calculation": "sum"}}, }) - time.sleep(0.2) + _settle(session) assert art["action"]._selector is sel_after_type def test_remove_chip_closes_window_and_drops_it(self, stem_4d_dataset): diff --git a/spyde/tests/migrated/test_window_computing_overlay.py b/spyde/tests/migrated/test_window_computing_overlay.py index 050a172d..4ad45cd5 100644 --- a/spyde/tests/migrated/test_window_computing_overlay.py +++ b/spyde/tests/migrated/test_window_computing_overlay.py @@ -88,26 +88,16 @@ def test_start_then_stop_bracket_the_progressive_nav_fill(self, monkeypatch, cap assert msgs[0]["computing"] is True # A stop must follow somewhere after it. assert any(m["computing"] is False for m in msgs[1:]) - finally: - session.shutdown() - - def test_stop_message_carries_same_window_id_as_start(self, monkeypatch, captured_messages): - monkeypatch.setenv("SPYDE_NO_DASK", "1") - session = _make_session() - try: - s = _lazy_4d() - session._add_signal(s, source_path=None) - assert _wait(lambda: any( - m.get("computing") is False for m in _computing_messages(captured_messages) - )) + # And every started window_id got a matching stop — a second + # property of the same captured message list (this ran as its own + # test with an identical session + fill). starts = [m["window_id"] for m in _computing_messages(captured_messages) if m["computing"] is True] stops = [m["window_id"] for m in _computing_messages(captured_messages) if m["computing"] is False] assert starts, "no start message emitted" assert stops, "no stop message emitted" - # Every started window_id eventually got a matching stop. assert set(starts) <= set(stops), ( f"started windows {set(starts)} missing a stop in {set(stops)}" )