Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reducing cognitive complexity of Parcels #1721

Open
VeckoTheGecko opened this issue Oct 3, 2024 · 3 comments
Open

Reducing cognitive complexity of Parcels #1721

VeckoTheGecko opened this issue Oct 3, 2024 · 3 comments
Labels
help wanted refactor code to refactor

Comments

@VeckoTheGecko
Copy link
Contributor

VeckoTheGecko commented Oct 3, 2024

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

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
Copy link
Contributor Author

VeckoTheGecko commented Oct 3, 2024

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
Copy link
Member

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
Copy link
Contributor Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted refactor code to refactor
Projects
Status: Backlog
Development

No branches or pull requests

2 participants