OceanParcels / Parcels

Main code for Parcels (Probably A Really Computationally Efficient Lagrangian Simulator)
https://www.oceanparcels.org
MIT License
294 stars 135 forks source link

Reducing cognitive complexity of Parcels #1721

Open VeckoTheGecko opened 1 month ago

VeckoTheGecko commented 1 month ago

Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and understand.

Large functions with lots of branching results in greater cognitive complexity. Refactoring on the biggest of these culprits will help with maintainability of Parcels and the ability to make new changes.

Output from complexipy

[complexipy](https://rohaquinlop.github.io/complexipy/) `complexipy --sort=desc parcels` ``` ──────────────────────────────────────────────────────────────────── 🐙 complexipy 0.4.0 ──────────────────────────────────────────────────────────────────── Summary ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓ ┃ Path ┃ File ┃ Function ┃ Complexity ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩ │ parcels/fieldset.py │ fieldset.py │ FieldSet::computeTimeChunk │ 143 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::execute │ 115 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_netcdf │ 100 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::__init__ │ 66 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::spatial_slip_interpolation │ 61 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::from_netcdf │ 58 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/application_kernels/advection.py │ advection.py │ AdvectionAnalytical │ 58 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::_check_complete │ 56 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_interpolator3D │ 55 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_search_indices_curvilinear │ 52 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particlefile.py │ particlefile.py │ ParticleFile::write │ 51 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::_computeTimeChunk │ 50 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::check_fieldsets_in_kernels │ 49 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleData::__init__ │ 46 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::__init__ │ 46 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_search_indices_rectilinear │ 44 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_Call │ 36 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::load_fieldset_jit │ 33 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_interpolator2D │ 31 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::__init__ │ 30 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/interactionkernel.py │ interactionkernel.py │ InteractionKernel::execute_python │ 30 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::lonlat │ 30 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_reshape │ 29 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::execute │ 27 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/gridset.py │ gridset.py │ GridSet::add_grid │ 26 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_failsafe_parse_ │ 26 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codecompiler.py │ codecompiler.py │ GNU_parameters::__init__ │ 26 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::data_access │ 24 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_get_initial_chunk_dictionary │ 23 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/interactionkernel.py │ interactionkernel.py │ InteractionKernel::execute │ 20 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::_apply_indices │ 18 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ IntrinsicTransformer::visit_Call │ 18 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::from_particlefile │ 17 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::evaluate_particle │ 17 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::get_fields │ 17 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::spatial_c_grid_interpolation2D │ 17 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particlefile.py │ particlefile.py │ ParticleFile::__init__ │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ParticleType::__init__ │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_data │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_get_initial_chunk_dictionary_by_dict_ │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_search_indices_vertical_s │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_calc_cell_edge_sizes │ 16 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/interactionkernel.py │ interactionkernel.py │ InteractionKernel::__init__ │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::depth │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::eval │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_time_index │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_search_indices_vertical_z │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_chunk_data │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_FunctionDef │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_Assign │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::generate │ 15 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::compile │ 14 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/hashspherical.py │ hashspherical.py │ geo_hash_to_neighbors │ 14 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_chunkmap_to_chunksize │ 14 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ NestedField::__getitem__ │ 14 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_collect_timeslices │ 14 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::write │ 12 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::__enter__ │ 12 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ IntrinsicTransformer::visit_Subscript │ 12 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ScipyParticle::add_variable │ 11 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::remove_lib │ 11 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::add_periodic_halo │ 11 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/converters.py │ converters.py │ TimeConverter::reltime │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::execute_python │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::ctypes_struct │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::computeTimeChunk │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_reconnect_bnd_indices │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ IntrinsicTransformer::visit_Name │ 10 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleData::add_same │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/hashflat.py │ hashflat.py │ hash_to_neighbors │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_c_grid_dataset │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_b_grid_dataset │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_get_available_dims_indices_by_request │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ NestedField::__init__ │ 9 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::_monte_carlo_sample │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleDataAccessor::__repr__ │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ScipyParticle::__repr__ │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::get_kernel_compile_files │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::__init__ │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_xarray_dataset │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::_parse_wildcards │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::_add_UVfield │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_is_dimension_in_dataset │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::spatial_c_grid_interpolation3D_full │ 8 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::lonlatdepth_dtype_from_field_interp_method │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/hashflat.py │ hashflat.py │ HashFlatNeighborSearch::_check_box │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ RectilinearGrid::add_periodic_halo │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::create_grid │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ CurvilinearGrid::add_periodic_halo │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_pop │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::add_vector_field │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::__init__ │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::parse_name │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::add_to_dimension_name_map_global │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_get_available_dims_indices_by_netcdf_file │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_data_concatenate │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/application_kernels/interaction.py │ interaction.py │ MergeWithNearestNeighbor │ 7 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/converters.py │ converters.py │ TimeConverter::fulltime │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::cleanup_remove_files │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/gridset.py │ gridset.py │ GridSet::dimrange │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::_add_Sdepth_periodic_halo │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::add_field │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ DaskFileBuffer::_is_dimension_chunked │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ DeferredArray::compute_shape │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ TupleSplitter::visit_Assign │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_Subscript │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_Print │ 6 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/timer.py │ timer.py │ Timer::print_tree │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/exampledata_utils.py │ exampledata_utils.py │ download_example_dataset │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::__getattr__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ScipyParticle::__init__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/basehash.py │ basehash.py │ BaseHashNeighborSearch::consistency_check │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ RectilinearSGrid::__init__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::depth_dimensions │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::_is_land2D │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_get_dim_filenames │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_chunk_setup │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_NestedVectorFieldEvalNode │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_Constant │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ IntrinsicTransformer::visit_Assign │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ FieldSetNode::__getattr__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codecompiler.py │ codecompiler.py │ VS_parameters::__init__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codecompiler.py │ codecompiler.py │ MinGW_parameters::__init__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codecompiler.py │ codecompiler.py │ Clang_parameters::__init__ │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/application_kernels/interaction.py │ interaction.py │ AsymmetricAttraction │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/application_kernels/advection.py │ advection.py │ AdvectionRK45 │ 5 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/timer.py │ timer.py │ Timer::print_tree_sequential │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/statuscodes.py │ statuscodes.py │ TimeExtrapolationError::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/converters.py │ converters.py │ convert_xarray_time_units │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/converters.py │ converters.py │ TimeConverter::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/rng.py │ rng.py │ RandomC::lib │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/rng.py │ rng.py │ RandomC::compile │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particlefile.py │ particlefile.py │ ParticleFile::_extend_zarr_dims │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particlefile.py │ particlefile.py │ ParticleFile::_create_variables_attribute_dict │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleDataIterator::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleData::set_variable_write_status │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleData::__getattr__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ParticleType::dtype │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ BaseKernel::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/base.py │ base.py │ BaseNeighborSearch::rebuild │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/interactionkernel.py │ interactionkernel.py │ InteractionKernel::check_kernel_signature_on_version │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ RectilinearZGrid::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ CurvilinearZGrid::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ CurvilinearSGrid::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::add_periodic_halo │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::time_access │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldfilebuffer.py │ fieldfilebuffer.py │ NetcdfFileBuffer::__enter__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ _deal_with_errors │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::write │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ LoopGenerator::generate │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ KernelGenerator::visit_VectorFieldEvalNode │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codecompiler.py │ codecompiler.py │ CCompiler::__init__ │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/application_kernels/interaction.py │ interaction.py │ NearestNeighborWithinRange │ 4 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/tools/interpolation_utils.py │ interpolation_utils.py │ jacobian3D_lin_face │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ _convert_to_reltime │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particleset.py │ particleset.py │ ParticleSet::populate_indices │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particledata.py │ particledata.py │ ParticleData::remove_multi_by_indices │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/particle.py │ particle.py │ ParticleType::__getitem__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::from_list │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/kernel.py │ kernel.py │ Kernel::cleanup_unload_lib │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/hashspherical.py │ hashspherical.py │ HashSphericalNeighborSearch::_find_neighbors │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/hashflat.py │ hashflat.py │ HashFlatNeighborSearch::_find_neighbors │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/basehash.py │ basehash.py │ BaseHashNeighborSearch::_deactivate_particles │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/interaction/neighborsearch/basehash.py │ basehash.py │ BaseHashNeighborSearch::_activate_particles │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ RectilinearGrid::__init__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::_child_ctypes_struct │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/grid.py │ grid.py │ Grid::_check_zonal_periodic │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_parcels │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_nemo │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::from_modulefile │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/fieldset.py │ fieldset.py │ FieldSet::checkvaliddimensionsdict │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::__init__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ VectorField::__getitem__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::eval │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_spatial_interpolation │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::_rescale_and_set_minmax │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/field.py │ field.py │ Field::__getitem__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ │ parcels/compilation/codegenerator.py │ codegenerator.py │ RandomNode::__getattr__ │ 3 │ ├──────────────────────────────────────────────────────┼──────────────────────────┼────────────────────────────────────────────────────────────┼────────────┤ ... ... 🧠 Total Cognitive Complexity in parcels: 2700 44 files analyzed in 0.0247 seconds ```

VeckoTheGecko commented 1 month ago

A bit of a comparison I whipped up (not 1to1 since the projects aren't the same sizes, but hopefully somewhat insightful)

output output

erikvansebille commented 1 month ago

Thanks @VeckoTheGecko, very interesting analysis! Now the question: is do we make our code less complex? Just start with the top-ranking methods int he complexipy output? What are the types of overly-complex syntax that can/need to be changed?

VeckoTheGecko commented 1 month ago

What are the types of overly-complex syntax that can/need to be changed?

I don't think there's a single answer, and I think there are lots of ways that we can make our code less complex. Refactoring Guru is a great resource that goes over the different approaches to address different pain points.

Having this measure is nice as a quick birds eye view of the codebase that can inform refactoring efforts.