fullwave25 1.4.2.dev2__tar.gz → 1.4.2.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.bumpversion.toml +1 -1
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/PKG-INFO +1 -1
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/__init__.py +1 -1
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/beamformer/beamformer.py +12 -3
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/transducer.py +50 -2
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/relaxation_parameters.py +51 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/pyproject.toml +1 -1
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/uv.lock +1 -1
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/.gitignore +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260911_1813_dead-code.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_1311_commit_message_of_the_input_generation_speedup.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_1311_pull_request_of_the_input_generation_speedup.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_1405_commit_message_of_the_relaxation_memory_estimate.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_1405_pull_request_of_the_relaxation_memory_estimate.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_2152_commit_message_of_the_cuda_version_choice.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_2152_pull_request_of_the_cuda_version_choice.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_2203_commit_message_of_the_cuda_version_tests.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_2213_commit_message_of_the_blackwell_version_choice.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/20260916_2213_pull_request_of_the_blackwell_version_choice.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/CLAUDE.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260909_1844_acquire_the_reflection_matrix.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260909_1900_test_on_a_synthetic_acquisition.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260909_1913_analyze_the_reflection_matrix.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260909_2107_redraw_the_figures_of_an_analysis.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260909_2121_write_the_result_tables.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260910_1126_synthesize_plane_waves_from_the_multistatic_matrix.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260910_1137_scan_the_speed_of_sound.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260910_1141_compare_the_laws_with_the_truth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260910_1146_evaluate_the_reverberation_filter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/20260910_1208_compare_plane_waves_with_the_synthesis.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/figures.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/ground_truth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/matrix_imaging.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/pipeline.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/reflection_matrix.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/speed_of_sound.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/matrix_imaging/synthetic.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260821_0206_band_anchor_cross_check.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260821_0233_delivered_power_law_end_to_end.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260821_0317_reword_deliver_in_the_library.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260821_1220_relaxation_low_frequency_rolloff.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260825_1937_what_fails_the_pml_golden_tests.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260825_2329_does_the_wrapper_read_the_record.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260826_0002_what_the_new_default_table_holds.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260828_1422_what_the_candidate_tables_hold.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260828_1427_what_the_deployment_needs.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260828_1510_where_the_unstretched_ramp_reaches.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260828_1517_the_blast_radius_of_the_ramp.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1458_the_3d_region_trimmed_kernel_against_the_reference.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1505_the_multi_node_kernel_against_the_multi_gpu_one.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1631_the_3d_multi_node_against_the_multi_gpu_one.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1642_the_selective_absorbing_layer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1728_the_layer_against_the_taper.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1757_what_the_margin_outside_the_layer_does.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1808_the_layer_in_3d_and_on_the_multi_node_builds.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1832_where_the_3d_residual_sits.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1837_inside_the_layer_at_the_corner.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1840_inside_the_3d_layer_at_the_corner.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1912_both_absorbers_on_one_method.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_1922_the_layer_on_the_reflection_method.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2011_whole_domain_animation.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2032_the_example_source_kind.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2148_drive_scale_of_the_strong_beta_cells.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2159_profile_the_input_map_build.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2201_build_then_extend_equivalence.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2304_the_transmit_methods_launch_what_they_say.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260830_2322_the_unscaled_added_drive_follows_the_courant_number.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0033_the_three_dimensional_arrays.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0054_the_elevation_lens_of_a_linear_array.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0115_run_every_example.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0124_move_the_notebooks_to_the_transmit_interface.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0137_the_air_region_at_four_mechanisms.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0148_the_element_records_its_own_transmit.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0150_the_absorbing_layer_of_a_point_source.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0152_the_exponential_absorbing_layer_against_its_thickness.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0202_the_rebuilt_exponential_absorbing_layer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0216_where_the_three_dimensional_layer_leaks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0222_the_absorbing_layer_away_from_the_source.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1037_where_the_near_field_brightness_comes_from.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1040_the_aperture_transit_wedge_in_the_channel_data.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1043_the_transmit_in_the_recorded_trace_and_its_removal.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1048_the_receive_row_against_the_reference_subtraction.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1052_the_backing_behind_the_array_face.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1056_the_transmit_beam_with_the_air_backing.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1105_the_shipped_transducer_stack_in_the_solver.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1119_where_the_stack_puts_the_source_and_what_it_costs_the_depth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1121_the_depth_the_image_reads_with_the_stack.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1123_the_depth_the_beamformer_puts_one_point_at.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1142_the_transmit_offset_the_beamformer_needs.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1145_the_depth_shift_the_offset_fix_makes.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1154_the_two_offset_rules_on_the_same_recording.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1212_what_the_pinned_release_carries.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1228_the_low_cut_against_the_near_field_haze.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1301_run_the_beamforming_notebooks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1432_point_dataset_generator_at_the_local_fullwave.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1437_the_aperture_width_the_reference_geometry_reports.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1454_calibrate_the_ats539_plane_wave.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1508_show_the_b_mode_in_the_hdf5.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1534_the_comet_behind_each_wire.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1547_read_the_calibration_trials.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1605_what_the_medium_holds_in_the_near_field.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1607_sweep_one_generator_knob.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1715_assert_the_ats539_rate_chain.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1717_measure_every_layer_of_the_stack.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1720_where_the_trailing_energy_lands.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1725_offer_the_requested_absorption_to_the_backing.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1727_let_a_sweep_carry_a_switch.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1731_expose_the_exponential_absorbing_layer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1746_point_the_solver_at_an_older_binary.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1756_measure_the_point_targets.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1802_rederive_the_near_field_bounce.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1810_does_the_shelf_move_with_depth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1812_find_the_repeat_delay_in_the_raw_rf.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1937_give_each_source_row_its_own_launch_delay.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1943_baffle_the_element_plane.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_1952_take_the_cell_size_from_the_grid.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2058_run_the_ats539_through_the_batched_solver.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2105_queue_the_remaining_candidates.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2122_the_simulator_asks_for_a_clamped_source.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2126_rename_the_source_types_to_hard_and_soft.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2140_bind_the_source_type_to_its_entrance.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2225_how_redundant_are_the_absorbing_layer_files.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2239_skip_the_constant_absorbing_layer_maps.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2246_count_the_files_a_run_writes.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2352_run_the_map_tiers_end_to_end.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_2355_draw_the_absorbing_layer_map_cost.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1502_can_the_transmit_reach_the_harmonic_band.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1504_contrast_harmonic_imaging.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1507_where_each_band_puts_its_largest_sample.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1519_is_the_harmonic_tail_cumulative.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1537_does_the_cancellation_work.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1612_does_a_sparse_bubble_cloud_localize.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1619_calibrate_the_bubble_scatter_range.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1622_draw_the_sweep_b_modes.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1654_where_the_bright_region_sits.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1701_where_one_bubble_images.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1702_does_the_portable_example_reproduce_the_evaluation.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1753_does_the_ported_solver_still_march_the_same.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1755_do_the_ranks_agree_on_the_bubbles.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1817_does_the_air_region_reach_every_solver.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260901_1818_does_the_air_region_reach_every_rank.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260902_1317_what_the_abdomen_volume_holds.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260902_1319_art_wave_in_the_abdomen.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260902_1324_art_figures_from_the_field.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260902_1744_art_final_animations.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260904_1216_art_wire_visibility.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260904_2327_b_mode_of_the_abdomen.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260905_0038_two_against_three_dimensions.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260909_1934_probe_the_reverberation_filter_on_speckle.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260909_1939_probe_the_ideal_profile_on_speckle.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260909_2044_probe_the_correction_bases_on_a_flat_speckle.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260909_2342_measure_the_wall_delay_screen.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1134_find_the_first_non_finite_value_of_the_plane_wave_correction.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1234_print_the_summaries_of_analyses.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/a_maps_checks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/b_effective_frequency.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/c_composed_steps.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_element_centers.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_plane_wave_law.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d2_gate_quarter_period.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d_gate_cases.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/e_plate_crash.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/f_patch_grid.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/g_frequency_scan.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/gouy_check.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/h_pulse_and_wires.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/i_phase_slope.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_006.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_007.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_008.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_009.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_010.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_006.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_007.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_008.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_47c5d913-2f0_a86c7568_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_006.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_007.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_008.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_009.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_006.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_007.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_001.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_002.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_003.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_004.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_005.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_006.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_007.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_008.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_009.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_010.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_011.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_012.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_013.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_014.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_015.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_016.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_guard_run.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_plane_wave_nan.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/j_wires_in_wall.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_checks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_das.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/quick_checks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_2.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_3.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_4.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/toy_plane_wave.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1241_check_that_the_records_load.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1241_locate_the_non_finite_values_of_an_analysis.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1241_measure_the_wire_depth_against_the_time_origin.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1241_print_the_time_origin_scans.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1241_test_the_entropy_the_antisymmetry_and_the_filter_linearity.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1247_time_the_phase_reversal_per_patch_against_batched.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1248_compare_the_synthesis_on_the_card_and_the_host.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1250_save_and_compare_the_local_laws_of_a_subset.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1254_analyze_the_2.5mhz_stage_2.sh +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1256_print_the_per_depth_curves_of_a_reverberation_test.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1302_print_the_durations_of_a_chain_log.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1314_print_the_gouy_points_of_a_speed_of_sound_scan.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1445_fit_the_moveout_speed_of_the_point_sources.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1456_fit_the_depth_offset_of_the_reference_arrivals.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1502_print_the_laws_and_gates_of_an_analysis.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1503_analyze_with_the_ramp_removal_off_or_every_law_one.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1504_measure_the_anti_diagonal_share_of_the_clean_clutter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1508_estimate_the_speed_with_smaller_windows.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1553_focus_the_clutter_records_in_sub_bands.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1553_print_the_band_and_the_screens_of_the_records.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1554_predict_the_phase_speed_of_the_stencil.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1556_compute_the_moveout_truth_with_an_eikonal_solver.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1556_fit_the_height_offset_on_three_grids.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1600_measure_the_flat_and_the_screen_correction_on_point_targets.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1604_predict_the_arrivals_from_the_stencil.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1604_prototype_the_broadband_correction.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1605_scan_the_time_origin_with_other_element_planes.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1607_measure_the_local_far_field_structure_of_the_clutter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1608_score_the_speed_scans_against_the_eikonal_truth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1610_compare_the_unwrapped_law_delays_with_the_truth.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1611_compare_the_arrival_models_at_the_point_sources.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1613_compare_the_sensor_pixel_with_the_element_center.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1613_measure_the_order_of_the_clutter_from_the_contrast_scaling.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1613_scan_the_speed_of_sound_at_one_time_origin.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1615_locate_the_source_and_sensor_pixels_of_the_array.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1617_check_the_data_level_correction_and_the_pulse_band.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1617_test_local_and_notch_filters_on_the_clutter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1621_compute_the_moveout_truth_with_a_chosen_arrival_model.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1622_measure_the_tilt_spread_of_the_wall_interfaces.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1623_tabulate_the_broadband_correction_runs.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1626_measure_the_ghost_depths_of_the_plate.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1626_score_the_product_of_the_transducer_laws.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1630_test_the_local_filter_with_padded_windows.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1632_fit_the_time_origin_and_the_speed_of_the_phantom_scans.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1634_fit_the_reference_speed_at_the_sensor_row.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1646_split_the_clutter_into_orders_and_predict_its_floor.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1652_tabulate_the_pulse_band_check.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260910_1659_check_the_plane_wave_transform_of_the_elements.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1103_compare_two_b_mode_roots.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1214_binary_cache_lookup_order.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1253_signal_of_old_against_new.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1300_read_the_numexpr_pool_limit.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1332_gpu_memory_of_the_relaxation_kernel.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1401_relaxation_regions_against_the_kernel.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1420_released_binary_carries_the_fix.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1601_stable_courant_number_of_the_stencil_table.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1602_fast_layer_in_a_small_3d_run.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1719_p4_1_pulse_energy_above_the_trace_nyquist.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1933_l7_4_run_at_8_ppw_stability_and_trace_sampling.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_1946_l7_4_trace_sampling_by_field_modulus.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2004_pulse_bands_of_the_two_abdomen_arrays.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2155_cuda_version_choice_before_and_after.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2155_gpu_architectures_in_cached_binaries.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2155_mutation_check_of_the_cuda_version_tests.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2155_verify_the_cuda_version_test_findings.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260916_2212_mutation_check_of_the_blackwell_version_choice.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260925_1321_selected_cuda_tag.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260925_1326_release_binary_bit_identity.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260925_1331_summarize_release_check.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/settings.local.json +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/skills/fullwave25/SKILL.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/convex_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/linear_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/matrix_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/patch.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/ruff.toml +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/superseded/convex_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/superseded/linear_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/superseded/matrix_transducer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/three_dimensional/test_patch.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/transducer_stack/README.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/transducer_stack/superseded/full_synthetic_aperture_with_stack.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/transducer_stack/superseded/plane_wave_compounding_with_stack.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.gitignore +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.pre-commit-config.yaml +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.python-version +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/20260120_0844.log +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/CITATION.cff +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/CONTRIBUTING.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/LICENSE +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/Makefile +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/README.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/attenuation.png +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/beamformer.m +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/docker/Dockerfile +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/docker/Dockerfile.dockerignore +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/docker/README.md +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/experiments/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/experiments/exp_scatterer_diameter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/beamformer/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/constants/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/constants/material_properties.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/grid.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/domain.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/medium_builder.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/data/.keep +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/data/abdominal_wall/i2365f_etfw1.mat +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/domain_abdominal_wall.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/domain_background.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/domain_scatterer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/domain_simple.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/medium_builder/presets/domain_water_gel.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/sensor.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/binary_manager.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/binary_markers.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda118 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda129 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda130 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda118 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda124 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda129 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda130 +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513.mat +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513_invalid_cells.json +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456.mat +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456_invalid_cells.json +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/cuda_utils.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/input_file_writer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/launcher.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/pml_builder.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/shipped_database.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/solver.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/source_type.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/solver/utils.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/source.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/transmit.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/backend.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/backend_2d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/binary.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/dat_io.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/dat_io_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/errors.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/factory.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/medium_to_aexp.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/stencil.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/time_axis.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/writer_2d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/ultra/writer_3d.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/__init__.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/check_functions.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/coordinates.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/gpu_memory.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/memory_tempfile.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/numerical.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/plot_utils.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/pulse.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/scatterer.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/signal_filter.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/fullwave/utils/signal_process.py +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/logs/20260815_0356_sweep.log +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/ruff.log +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/ruff.toml +0 -0
- {fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/signal_filter_example.png +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fullwave25
|
|
3
|
-
Version: 1.4.2-
|
|
3
|
+
Version: 1.4.2-dev3
|
|
4
4
|
Summary: Fullwave 2.5: Ultrasound wave propagation simulation with heterogeneous power law attenuation modelling capabilities
|
|
5
5
|
Author: Masashi Sode, Gianmarco Pinton
|
|
6
6
|
Maintainer: Masashi Sode
|
|
@@ -66,7 +66,7 @@ try:
|
|
|
66
66
|
__version__ = version("fullwave")
|
|
67
67
|
except PackageNotFoundError:
|
|
68
68
|
# Update via bump-my-version, not manually
|
|
69
|
-
__version__ = "1.4.2-
|
|
69
|
+
__version__ = "1.4.2-dev3"
|
|
70
70
|
|
|
71
71
|
VERSION = __version__ # for convenience
|
|
72
72
|
logger.info("Fullwave version: %s", __version__)
|
|
@@ -14,6 +14,13 @@ class Beamformer:
|
|
|
14
14
|
For faster implementations, consider using libraries such as
|
|
15
15
|
mach beamformer: https://github.com/Forest-Neurotech/mach
|
|
16
16
|
|
|
17
|
+
Conventions: ``axial_position_m`` is measured from the top of the grid
|
|
18
|
+
(row 0), not from the array. ``transducer_coordinates`` must be the
|
|
19
|
+
receiver positions in grid points (for example from
|
|
20
|
+
``Transducer.element_id_to_receiver_center``). The time origin is the
|
|
21
|
+
mean receiver row, so the array depth is subtracted from the two-way
|
|
22
|
+
travel time.
|
|
23
|
+
|
|
17
24
|
References
|
|
18
25
|
----------
|
|
19
26
|
- Fullwave2 BMME890 implementation
|
|
@@ -46,11 +53,11 @@ class Beamformer:
|
|
|
46
53
|
lateral_position_m : np.ndarray
|
|
47
54
|
Lateral positions (m) where the beamformed image will be computed.
|
|
48
55
|
axial_position_m : np.ndarray
|
|
49
|
-
Axial positions (m) where the
|
|
56
|
+
Axial positions (m) from the top of the grid where the image is computed.
|
|
50
57
|
num_elements : int
|
|
51
58
|
Number of transducer elements.
|
|
52
59
|
transducer_coordinates : np.ndarray
|
|
53
|
-
|
|
60
|
+
Receiver coordinates [n_elements, 2] in grid points (row, column).
|
|
54
61
|
f_number : float, optional
|
|
55
62
|
F-number for aperture calculation, by default 1.0.
|
|
56
63
|
|
|
@@ -83,6 +90,8 @@ class Beamformer:
|
|
|
83
90
|
if signals.ndim == 2:
|
|
84
91
|
signals = signals[:, :, np.newaxis]
|
|
85
92
|
n_transmit = signals.shape[2]
|
|
93
|
+
# idt_0 is the pulse arrival at the receivers, so time is measured from the array.
|
|
94
|
+
z_array = np.mean(self.transducer_coordinates[:, 0]) * self.dx
|
|
86
95
|
|
|
87
96
|
hilbert_signals = hilbert(signals, axis=1)
|
|
88
97
|
beamformed_image = np.zeros(
|
|
@@ -133,7 +142,7 @@ class Beamformer:
|
|
|
133
142
|
dd = np.round(dd / (self.dt / self.dx * self.c0)).astype(int)
|
|
134
143
|
dd = dd - dd.min()
|
|
135
144
|
|
|
136
|
-
idt = idt_0 + int(2 * axial / self.c0 / self.dt)
|
|
145
|
+
idt = idt_0 + int(2 * (axial - z_array) / self.c0 / self.dt)
|
|
137
146
|
|
|
138
147
|
# idp: 1D indices into signals flattened array
|
|
139
148
|
# we convert 2D indices to 1D indices
|
|
@@ -352,6 +352,9 @@ class TransducerGeometry:
|
|
|
352
352
|
) -> tuple[NDArray[np.int64], NDArray[np.int64], NDArray[np.int64], NDArray[np.int64]]:
|
|
353
353
|
"""Build flat coordinate arrays for source and sensor pixels.
|
|
354
354
|
|
|
355
|
+
For a flat array the sensor row is the first row in front of the element
|
|
356
|
+
(``position_px[0] + element_layer_px``), outside the source cells.
|
|
357
|
+
|
|
355
358
|
Returns
|
|
356
359
|
-------
|
|
357
360
|
source_coords : NDArray[np.int64], shape [N_src, ndim]
|
|
@@ -404,7 +407,7 @@ class TransducerGeometry:
|
|
|
404
407
|
source_ids_parts.append(np.full(len(src), element_index + 1))
|
|
405
408
|
|
|
406
409
|
# Single center pixel for sensor output
|
|
407
|
-
sx =
|
|
410
|
+
sx = self._flat_sensor_row(element_pos_x=element_pos_x)
|
|
408
411
|
sy = element_pos_y + self.element_width_px - 1
|
|
409
412
|
sz = element_pos_z + self.element_height_px // 2 - 1
|
|
410
413
|
sensor_coords_parts.append(np.array([[sx, sy, sz]]))
|
|
@@ -432,7 +435,7 @@ class TransducerGeometry:
|
|
|
432
435
|
source_coords_parts.append(src)
|
|
433
436
|
source_ids_parts.append(np.full(len(src), element_index + 1))
|
|
434
437
|
|
|
435
|
-
sx =
|
|
438
|
+
sx = self._flat_sensor_row(element_pos_x=element_pos_x)
|
|
436
439
|
if self.average_surface_signals:
|
|
437
440
|
out_ys = np.arange(element_pos_y, element_pos_y + self.element_width_px)
|
|
438
441
|
out_xs = np.full(len(out_ys), sx)
|
|
@@ -452,6 +455,39 @@ class TransducerGeometry:
|
|
|
452
455
|
sensor_ids = np.concatenate(sensor_ids_parts, axis=0).astype(np.int64)
|
|
453
456
|
return source_coords, source_ids, sensor_coords, sensor_ids
|
|
454
457
|
|
|
458
|
+
def _flat_sensor_row(self, *, element_pos_x: int) -> int:
|
|
459
|
+
"""Return the sensor row of a flat-array element.
|
|
460
|
+
|
|
461
|
+
The row lies in front of the source cells because a hard source keeps a
|
|
462
|
+
static pressure after the drive, which a receiver inside it would record.
|
|
463
|
+
|
|
464
|
+
Parameters
|
|
465
|
+
----------
|
|
466
|
+
element_pos_x : int
|
|
467
|
+
First (back) source row of the element.
|
|
468
|
+
|
|
469
|
+
Returns
|
|
470
|
+
-------
|
|
471
|
+
int
|
|
472
|
+
The sensor row, ``element_pos_x + element_layer_px``.
|
|
473
|
+
|
|
474
|
+
Raises
|
|
475
|
+
------
|
|
476
|
+
ValueError
|
|
477
|
+
If the sensor row is outside the grid.
|
|
478
|
+
|
|
479
|
+
"""
|
|
480
|
+
sensor_row = int(element_pos_x + self.element_layer_px)
|
|
481
|
+
if sensor_row >= self.stored_grid_size[0]:
|
|
482
|
+
error_msg = (
|
|
483
|
+
f"The sensor row {sensor_row} (one row in front of the element) is "
|
|
484
|
+
f"outside the grid, which has {self.stored_grid_size[0]} rows in x. "
|
|
485
|
+
"Move the transducer back or enlarge the grid."
|
|
486
|
+
)
|
|
487
|
+
logger.error(error_msg)
|
|
488
|
+
raise ValueError(error_msg)
|
|
489
|
+
return sensor_row
|
|
490
|
+
|
|
455
491
|
def _arc_element_coords(
|
|
456
492
|
self,
|
|
457
493
|
) -> tuple[NDArray[np.int64], NDArray[np.int64], NDArray[np.int64], NDArray[np.int64]]:
|
|
@@ -1728,6 +1764,18 @@ class Transducer:
|
|
|
1728
1764
|
out[eid] = np.rint(coords[sel].mean(axis=0)).astype(np.int64)
|
|
1729
1765
|
return out
|
|
1730
1766
|
|
|
1767
|
+
@property
|
|
1768
|
+
def element_id_to_receiver_center(self) -> dict[int, NDArray[np.int64]]:
|
|
1769
|
+
"""Return the mapping from element IDs to the mean receiver coordinate in grid points."""
|
|
1770
|
+
ndim = 3 if self.is_3d else 2
|
|
1771
|
+
out: dict[int, NDArray[np.int64]] = {}
|
|
1772
|
+
for eid, coords in self.element_id_to_element_surface.items():
|
|
1773
|
+
if len(coords) == 0:
|
|
1774
|
+
out[eid] = np.full(ndim, -1, dtype=np.int64)
|
|
1775
|
+
else:
|
|
1776
|
+
out[eid] = np.rint(coords.mean(axis=0)).astype(np.int64)
|
|
1777
|
+
return out
|
|
1778
|
+
|
|
1731
1779
|
@property
|
|
1732
1780
|
def sensor(self) -> fullwave.sensor.Sensor:
|
|
1733
1781
|
"""Return the Sensor object with active sensor coordinates.
|
|
@@ -35,6 +35,44 @@ def _on_the_host(array: NDArray) -> NDArray:
|
|
|
35
35
|
return _array_module(array).asnumpy(array)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
# float32 stores 1.2 as 1.2000000477 (about 6e-8 relative); table nodes are 1e-2 or more apart.
|
|
39
|
+
_FLOAT32_NOISE_RTOL = 1e-6
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _snap_to_nearby_node(
|
|
43
|
+
*,
|
|
44
|
+
values: NDArray[np.float64],
|
|
45
|
+
nodes: NDArray[np.float64],
|
|
46
|
+
xp: object,
|
|
47
|
+
) -> NDArray[np.float64]:
|
|
48
|
+
"""Replace each value that is float32 noise away from a table node by that node.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
values : NDArray[np.float64]
|
|
53
|
+
Requested values.
|
|
54
|
+
nodes : NDArray[np.float64]
|
|
55
|
+
Sorted table nodes.
|
|
56
|
+
xp : object
|
|
57
|
+
Array module of ``values``, numpy or cupy.
|
|
58
|
+
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
|
+
NDArray[np.float64]
|
|
62
|
+
The values, with near-node values replaced by the node.
|
|
63
|
+
|
|
64
|
+
"""
|
|
65
|
+
if nodes.size < 2:
|
|
66
|
+
return values
|
|
67
|
+
values = xp.asarray(values)
|
|
68
|
+
upper_index = xp.clip(xp.searchsorted(nodes, values, side="left"), 1, nodes.size - 1)
|
|
69
|
+
lower_node = nodes[upper_index - 1]
|
|
70
|
+
upper_node = nodes[upper_index]
|
|
71
|
+
is_near_lower = xp.abs(values - lower_node) <= _FLOAT32_NOISE_RTOL * xp.abs(lower_node)
|
|
72
|
+
is_near_upper = xp.abs(values - upper_node) <= _FLOAT32_NOISE_RTOL * xp.abs(upper_node)
|
|
73
|
+
return xp.where(is_near_lower, lower_node, xp.where(is_near_upper, upper_node, values))
|
|
74
|
+
|
|
75
|
+
|
|
38
76
|
def scale_relaxation_attenuation(
|
|
39
77
|
relaxation_param_dict: dict[str, NDArray[np.float64]],
|
|
40
78
|
factor: NDArray[np.float64] | float,
|
|
@@ -938,6 +976,8 @@ class RelaxationParametersGenerator:
|
|
|
938
976
|
|
|
939
977
|
"""
|
|
940
978
|
alpha_coeff = band_scaled_alpha_coeff(alpha_coeff, alpha_power, band_scale)
|
|
979
|
+
alpha_coeff = self._snap_to_table(alpha_coeff, table_axis=self.alpha_list)
|
|
980
|
+
alpha_power = self._snap_to_table(alpha_power, table_axis=self.power_list)
|
|
941
981
|
self._warn_invalid(alpha_coeff, alpha_power)
|
|
942
982
|
|
|
943
983
|
use_gpu = not isinstance(alpha_coeff, np.ndarray)
|
|
@@ -991,6 +1031,7 @@ class RelaxationParametersGenerator:
|
|
|
991
1031
|
|
|
992
1032
|
"""
|
|
993
1033
|
xp = np if isinstance(alpha_coeff, np.ndarray) else _array_module(alpha_coeff)
|
|
1034
|
+
alpha_coeff = self._snap_to_table(alpha_coeff, table_axis=self.alpha_list)
|
|
994
1035
|
axis = xp.asarray(np.asarray(self.alpha_list).ravel().round(10))
|
|
995
1036
|
return (
|
|
996
1037
|
alpha_coeff / axis[self._axis_index(alpha_coeff, axis, self.alpha_min, self.alpha_max)]
|
|
@@ -1113,6 +1154,15 @@ class RelaxationParametersGenerator:
|
|
|
1113
1154
|
],
|
|
1114
1155
|
)
|
|
1115
1156
|
|
|
1157
|
+
@staticmethod
|
|
1158
|
+
def _snap_to_table(
|
|
1159
|
+
values: NDArray[np.float64], *, table_axis: NDArray[np.float64]
|
|
1160
|
+
) -> NDArray[np.float64]:
|
|
1161
|
+
"""Replace each value that is float32 noise away from a node of one table axis."""
|
|
1162
|
+
xp = np if isinstance(values, np.ndarray) else _array_module(values)
|
|
1163
|
+
nodes = xp.asarray(np.asarray(table_axis).ravel().round(10))
|
|
1164
|
+
return _snap_to_nearby_node(values=values, nodes=nodes, xp=xp)
|
|
1165
|
+
|
|
1116
1166
|
@staticmethod
|
|
1117
1167
|
def _axis_index(
|
|
1118
1168
|
value: NDArray[np.float64],
|
|
@@ -1122,6 +1172,7 @@ class RelaxationParametersGenerator:
|
|
|
1122
1172
|
) -> NDArray[np.int64]:
|
|
1123
1173
|
"""Return the axis index the lookup kernel selects, which clips at both ends."""
|
|
1124
1174
|
xp = np if isinstance(value, np.ndarray) else _array_module(value)
|
|
1175
|
+
value = _snap_to_nearby_node(values=value, nodes=axis, xp=xp)
|
|
1125
1176
|
clipped = xp.clip(value, lowest, highest)
|
|
1126
1177
|
return xp.minimum(xp.searchsorted(axis, clipped, side="left"), axis.size - 1)
|
|
1127
1178
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fullwave25"
|
|
3
|
-
version = "1.4.2-
|
|
3
|
+
version = "1.4.2-dev3" # Update via bump-my-version, not manually
|
|
4
4
|
description = "Fullwave 2.5: Ultrasound wave propagation simulation with heterogeneous power law attenuation modelling capabilities"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fullwave25-1.4.2.dev2 → fullwave25-1.4.2.dev3}/.claude/scratch/20260831_0115_run_every_example.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|