From 144ac36a8c485957d642b310e72f138b55d6ab34 Mon Sep 17 00:00:00 2001 From: Kaustav Deka <116963260+deka27@users.noreply.github.com> Date: Thu, 22 Aug 2024 03:31:56 +0530 Subject: [PATCH] DOC: Final Report --- _static/css/common/override.css | 7 + _static/images/logos/dipy-logo-2.png | Bin 0 -> 14365 bytes _static/images/logos/gsoc-logo.png | Bin 0 -> 37903 bytes _static/images/logos/python-logo.png | Bin 0 -> 9907 bytes .../2024/2024_08_21_kaustav_final_report.rst | 458 ++++++++++++++++++ 5 files changed, 465 insertions(+) create mode 100644 _static/images/logos/dipy-logo-2.png create mode 100644 _static/images/logos/gsoc-logo.png create mode 100644 _static/images/logos/python-logo.png create mode 100644 posts/2024/2024_08_21_kaustav_final_report.rst diff --git a/_static/css/common/override.css b/_static/css/common/override.css index 414fd900..d413be12 100644 --- a/_static/css/common/override.css +++ b/_static/css/common/override.css @@ -7,3 +7,10 @@ override the pydata-theme and sphinx. padding: 1.1rem 1.1rem 1.1rem 0; } +.no-background { + background: transparent !important; +} + +.gsoc-title { + color: #fd8d25 !important; +} diff --git a/_static/images/logos/dipy-logo-2.png b/_static/images/logos/dipy-logo-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4668353b4093ca1a029219ea7eaf9c141aab5841 GIT binary patch literal 14365 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 literal 0 HcmV?d00001 diff --git a/_static/images/logos/python-logo.png b/_static/images/logos/python-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc7ed299b884ac38d1586fd730786c8ae530bf3 GIT binary patch literal 9907 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 YoGoogle Summer of Code Final Work Product + +.. |project-abstract-title| raw:: html + + Project Abstract + +.. |proposed-objectives-title| raw:: html + + Proposed Objectives + +.. |objectives-completed-title| raw:: html + + Objectives Completed + +.. |objectives-progress-title| raw:: html + + Objectives in Progress + +.. |future-work-title| raw:: html + + Future Works + +.. |timeline-title| raw:: html + + Timeline + +.. image:: /_static/images/logos/gsoc-logo.png + :height: 40 + :target: https://summerofcode.withgoogle.com/programs/2024/projects/dHajBmW3 + :class: no-background + +.. image:: /_static/images/logos/python-logo.png + :height: 40 + :target: https://summerofcode.withgoogle.com/programs/2024/organizations/python-software-foundation + :class: no-background + +.. image:: /_static/images/logos/dipy-logo-2.png + :height: 30 + :target: http://dipy.org + :class: no-background + +.. raw:: html + +
+ +|main-title| +============ + +.. post:: August 21 2024 + :author: Kaustav + :tags: google + :category: gsoc + +- **Name:** `Kaustav Deka `_ +- **Organization:** `Python Software Foundation `_ +- **Sub-Organization:** `DIPY `_ +- **Project:** `Modernize DIPY Codebase `_ + +|project-abstract-title| +------------------------ + +This project is dedicated to implementing crucial improvements to DIPY, with the primary goal of enhancing its functionality, efficiency, and user experience through a series of targeted updates and additions. + +This initiative comprehensively covers several critical development areas, including transitioning to keyword-only arguments to boost code robustness and readability, and implementing lazy loading to optimize resource management and overall performance. + +The project also aims to improve and simplify the current website management system, enhancing user interaction and information accessibility. Furthermore, it focuses on streamlining the Issues and Pull Requests triage process, incorporating automation to increase efficiency. The integration of multiple GitHub Actions is planned to further streamline workflows. Additionally, the project involves refactoring select DIPY packages and improving docstring documentation, ensuring clearer and more maintainable code. Lastly, new tutorials will be added to support user education and engagement, making DIPY more accessible to both new and experienced users. + +|proposed-objectives-title| +--------------------------- + +The objectives include: + +1. **Transitioning to Keyword-Only Arguments**: Restructuring function calls to utilize keyword-only arguments for improved code clarity and robustness. + +.. raw:: html + +
+ +2. **Lazy Loading Integration**: Implementing lazy loading techniques to load resources dynamically, thereby optimizing performance and reducing memory footprint. + +.. raw:: html + +
+ +3. **Improvement and Simplification of Website Management**: Enhancing the management of the DIPY website to streamline content updates and provide a more user-friendly experience for visitors. + +.. raw:: html + +
+ +4. **Integration of Multiple GitHub Actions**: Implementing a suite of GitHub Actions to simplify development workflows, automate repetitive tasks, and enhance collaboration among contributors. + +.. raw:: html + +
+ +5. **Improvement of Issues and Pull Requests Triage + Triage Automation**: Enhancing the process of managing issues and pull requests by implementing efficient triage practices and automation tools to streamline the review and resolution process. + +.. raw:: html + +
+ +6. **Refactoring of DIPY Packages + Improvement of Docstrings**: Conducting targeted refactoring of DIPY packages to improve code structure, readability, and maintainability. Additionally, enhancing docstrings to provide comprehensive documentation for developers and users. + +.. raw:: html + +
+ +7. **Addition of Tutorials**: Creating new tutorials to guide users through various aspects of DIPY functionality, ensuring accessibility for users of all experience levels and facilitating learning and adoption. + +.. raw:: html + +
+ +|objectives-completed-title| +---------------------------- + +1. Keyword-Only Arguments +------------------------- + +This task focused on transitioning DIPY's codebase to use keyword-only arguments in function calls. Keyword arguments are a powerful feature in Python that allow for more explicit and self-documenting function calls. They offer several advantages: + +i. **Improved readability:** By using keyword arguments, it's immediately clear what each argument represents, making the code easier to understand. +ii. **Reduced errors:** Keyword arguments reduce the risk of passing arguments in the wrong order. +iii. **Better API design:** They allow for more flexible function signatures and make it easier to add optional parameters without breaking existing code. + +In the future, we want all function calls in DIPY to use keyword arguments instead of positional arguments. To facilitate this transition, I created a decorator that provides warnings when functions are called with positional arguments instead of keyword arguments. + +Here's how the decorator works: + +.. code-block:: python + + @warning_for_keyword() + def function(a, b, *, c=100): + pass + + variable = function(a, b, 50) # This will trigger a warning + +In this example, the decorator will issue a warning saying that ``c`` is being called as a positional argument when it should be a keyword argument. + +For the transition phase, we're providing warnings instead of completely blocking the function execution. This approach allows for a smoother migration, giving developers time to update their code while still maintaining functionality. + +The implementation of this decorator was a significant part of the project. You can find the full pull request for the decorator here: `PR #3239 `_ + +After creating the decorator, I applied it systematically across various DIPY modules. This extensive work touched many parts of the codebase: + +- **align** `PR #3249 `_: Applied to alignment algorithms. +- **core** `PR #3251 `_: Updated core functionality of DIPY. +- **data** `PR #3253 `_: Modified data handling functions. +- **denoise** `PR #3252 `_: Updated denoising algorithms. +- **io** `PR #3255 `_: Applied to input/output operations. +- **nn** `PR #3256 `_: Modified neural network related functions. +- **segment** `PR #3258 `_: Updated segmentation algorithms. +- **sims** `PR #3259 `_: Applied to simulation functions. +- **tracking** `PR #3260 `_: Modified tracking algorithms. +- **utils** `PR #3261 `_: Updated utility functions. +- **viz** `PR #3262 `_: Applied to visualization functions. +- **workflows** `PR #3263 `_: Modified workflow-related functions. + +This comprehensive application of the decorator across DIPY's modules represents a significant step towards modernizing the codebase. It not only improves the immediate readability and robustness of the code but also sets the stage for future enhancements and maintains consistency across the project. + +The warnings generated by this decorator will help both DIPY developers and users transition to using keyword arguments, ultimately leading to more maintainable and error-resistant code. As the community adapts to this change, we expect to see a gradual reduction in the use of positional arguments, paving the way for potentially making keyword arguments mandatory in future releases. + +2. Website Improvements +----------------------- + +Several tasks were undertaken to improve the DIPY website, enhancing its functionality, organization, and user experience. These improvements are crucial for maintaining an effective online presence and ensuring that our community has easy access to all relevant information. + +a. Blog Post Migration +^^^^^^^^^^^^^^^^^^^^^^ + +One of the major tasks was the migration of blog posts from various old sources to our current website. This consolidation effort ensures that all valuable information is accessible on our main platform. The migration involved working with three different sources: + +- A Blogspot site dedicated to GSoC 2015 +- A personal blog +- A Google Docs document + +This task was crucial for several reasons: + +- It centralizes our content, making it easier for users to locate information. +- It ensures that valuable historical content is not lost. +- It provides a unified platform for all DIPY-related blog posts. + +For more details, see the related issue: `Issue #11 `_ + +b. Image Organization Improvement +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Upon reviewing our image organization, it became apparent that the existing system was chaotic and in need of improvement. To address this, a new organizational structure for our images was proposed and implemented. The new system organizes images by year and contributor, which offers several benefits: + +- Easier navigation and retrieval of images +- Better tracking of image contributions over time +- Improved ability to manage and update image assets + +.. code-block:: text + + _static/images/gsoc/[year]/[name_of_contributor] + +This reorganization sets the stage for more efficient image management in the future. + +For more information, refer to: `Issue #50 `_ + +c. DIPY Wiki Migration +^^^^^^^^^^^^^^^^^^^^^^ + +Another significant task was migrating our GSoC (Google Summer of Code) and GSOD (Google Season of Docs) announcements from the DIPY wiki to our main blog. This migration is part of our ongoing efforts to centralize content and make important announcements more accessible to our community. Benefits of this migration include: + +- Increased visibility of GSoC and GSOD announcements +- Improved searchability of this content +- Consistency in how we present important project information + +You can find more details in: `Issue #21 `_ + +d. Adding Sidebars to Blog Page +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +An enhancement suggested by my mentor was implemented: adding a sidebar to our ``blog.html`` page. Previously, the blog page lacked a sidebar, which made navigation less intuitive and user-friendly. The new sidebar significantly improves the blog's usability by providing: + +- Quick access to important navigational elements +- Categories for easy content classification +- Archives for exploring historical posts +- Tags for topic-based navigation + +These additions allow users to easily browse through our blog content, find related posts, or explore posts from specific time periods. The sidebar enhances the overall user experience and makes our blog more engaging and accessible. + +The pull request for this feature can be found here: `PR #53 `_ + +Conclusion +^^^^^^^^^^ + +These website improvements represent a significant step forward in enhancing DIPY's online presence. By consolidating content, improving organization, and enhancing navigation, we've made it easier for our community to engage with DIPY's resources and stay informed about project developments. These changes lay a solid foundation for future improvements and will contribute to the growth and accessibility of the DIPY project. + +|objectives-progress-title| +--------------------------- + +1. Keyword-Only Arguments +------------------------- + +Implementation of keyword-only arguments is still in progress for two modules: + +a. Direction module (`PR #3254 `_) +b. Reconst module (`PR #3257 `_) + +Next Steps +^^^^^^^^^^ + +- Conduct testing and address feedback +- Merge changes once approved + +2. Lazy Loading +--------------- + +Lazy loading is a crucial optimization technique that has been implemented in DIPY to enhance resource management and improve performance, particularly for large-scale neuroimaging applications. By delaying the loading of modules until they are actually needed, we achieve a more efficient and responsive system. + +Implementation Details +^^^^^^^^^^^^^^^^^^^^^^ + +- **Package Used:** The ``lazy_loader`` package has been employed to implement lazy loading functionality in DIPY, allowing for on-demand module loading. +- **Inspiration:** This approach draws inspiration from the scikit-image library, which has effectively utilized lazy loading to optimize its performance and reduce memory usage. + +The core concept involves creating a stub file, such as `__init__.pyi`, where all functions from the module are imported. This stub file is then imported into the main initialization file, `__init__.py`, enabling lazy loading for the specified submodules. + +Here’s an outline of how it works: + +.. code-block:: python + :caption: __init__.pyi + + submodules = [ + "align", + "core", + "data", + "denoise", + "direction", + "io", + "nn", + "reconst", + "segment", + "sims", + "stats", + "tracking", + "utils", + "viz", + "workflows", + "tests", + "testing", + ] + + __all__ = submodules + +In the main initialization file, lazy loading is attached to the module using the following setup: + +.. code-block:: python + :caption: __init__.py + + __getattr__, __lazy_dir__, _ = lazy.attach_stub(__name__, __file__) + +This structure ensures that each submodule is only loaded when it is explicitly accessed, thereby optimizing both memory usage and load times. + +Benefits of Lazy Loading +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **Reduced Initial Load Time:** By loading modules and objects only when they are needed, the initial load time of DIPY is significantly decreased, leading to a faster startup. +- **Memory Optimization:** On-demand loading minimizes unnecessary memory usage, which is particularly advantageous when working with large datasets in neuroimaging. +- **Improved Performance:** Lazy loading can lead to better overall performance, especially in scenarios where only specific subsets of DIPY’s functionality are used. +- **Enhanced Modularity:** This approach encourages a more modular code structure, improving maintainability and simplifying the addition of new features in the future. + +Current Status +^^^^^^^^^^^^^^ + +- The implementation of lazy loading across all planned modules has been completed. +- The changes are currently under review by the DIPY team, with final input and feedback pending. +- The updated modules are expected to be merged into the main codebase shortly after the review process is complete. + +Next Steps +^^^^^^^^^^ + +- **Incorporate Feedback:** Address any feedback or suggestions provided by the DIPY team during the review. +- **Final Testing:** Conduct thorough testing to ensure that all lazy-loaded components function as expected under various conditions. +- **Documentation Update:** Update the project documentation to reflect the new lazy loading behavior, providing clear guidance on how it impacts module usage. +- **Merge and Monitor:** Once approved, merge the changes into the main DIPY codebase and monitor initial user feedback and performance metrics post-deployment. + +This implementation of lazy loading represents a significant step forward in optimizing DIPY's performance and usability, particularly in resource-intensive environments. + +3. Docker Integration +--------------------- + +Current Status +^^^^^^^^^^^^^^ + +The Docker integration for DIPY is currently under development. A pull request has been submitted to introduce Docker support, aimed at enhancing the consistency and ease of development, testing, and deployment across different environments: + +- **Pull Request:** `PR #3322 `_ + +To achieve a minimal yet functional configuration, I created the following Dockerfile: + +.. code-block:: dockerfile + :caption: Dockerfile + + FROM python:3.10 + + RUN apt-get update && apt-get install -y --no-install-recommends \ + libhdf5-dev \ + gcc \ + && rm -rf /var/lib/apt/lists/* \ + && apt-get clean + + RUN pip install --no-cache-dir \ + numpy==1.26.4 \ + dipy \ + nibabel \ + scipy \ + matplotlib + +This Dockerfile sets up a Python 3.10 environment with the essential dependencies for DIPY, including `numpy`, `dipy`, `nibabel`, `scipy`, and `matplotlib`. The use of `--no-install-recommends` and `--no-cache-dir` ensures a lean and efficient image by minimizing unnecessary packages and caching. + +Additionally, I developed build and push scripts to automate the Docker image creation and deployment process. These scripts streamline the workflow, making it easier for developers to build and push images to a Docker registry with minimal effort. + +Next Steps +^^^^^^^^^^ + +1. **Incorporate Feedback**: Address any suggestions or concerns raised during the code review process. +2. **Cross-Environment Testing**: Test the Docker setup across various environments to ensure compatibility and stability. +3. **Documentation Update**: Revise the project documentation to include comprehensive guidelines on using Docker with DIPY, including setup, usage, and troubleshooting tips. +4. **CI/CD Integration**: Integrate Docker into the Continuous Integration/Continuous Deployment (CI/CD) pipeline to automate builds, tests, and deployments, ensuring a robust and consistent development workflow. + +The implementation of Docker is a critical step in modernizing DIPY's development process, providing a standardized environment that reduces setup time and ensures consistency across different platforms. We expect to finalize and merge this feature soon, following thorough testing and review. + +|future-work-title| +------------------- + +1. Addition of Tutorials +------------------------- + +As part of my ongoing efforts to improve DIPY's accessibility and user experience, I am planning to develop new tutorials. These tutorials will focus on two key areas: + +a. 2D Registration +^^^^^^^^^^^^^^^^^^ + +The 2D registration tutorial will cover: + +- **Overview of 2D Registration Algorithms**: An explanation of the different 2D registration algorithms in DIPY, with a focus on when and how to use them. +- **Step-by-Step Guide**: A detailed, step-by-step process for performing 2D registration using DIPY, making it easy to follow along. +- **Optimization Tips**: Tips for getting the best results from 2D registration, including parameter adjustments and troubleshooting. + +b. Docker Usage +^^^^^^^^^^^^^^^ + +The Docker tutorial will include: + +- **Introduction to Docker**: An overview of Docker and why it is useful for DIPY users. +- **Setting Up Docker for DIPY**: Instructions for setting up Docker specifically for DIPY, including installation and configuration. +- **Running DIPY in a Docker Container**: How to run DIPY within a Docker container, with common commands and workflows. +- **Best Practices**: Advice on how to use Docker with DIPY effectively, focusing on performance and resource management. +- **Troubleshooting**: Common issues you might encounter with Docker and how to solve them. + +Objectives +^^^^^^^^^^ + +By adding these tutorials, I aim to: + +1. **Lower the Entry Barrier**: Make it easier for new DIPY users to get started. +2. **Provide Clear Guidance**: Offer practical, easy-to-follow instructions on using DIPY. +3. **Encourage Best Practices**: Help users adopt best practices in neuroimaging analysis. +4. **Support Reproducible Research**: Teach users how to create consistent environments using Docker, which will help ensure reliable and reproducible results. + +|timeline-title| +---------------- + +.. list-table:: Weekly Journey + :header-rows: 1 + :widths: 20 60 15 + + * - Date + - Title + - Blog Link + * - 27-05-2024 + - My Journey Begins: Community Bonding Period with DIPY + - `Week 0 `__ + * - 03-06-2024 + - Starting with keyword-only-decorator function + - `Week 1 `__ + * - 12-06-2024 + - Decorator function refinement, Lazy loading research + - `Week 2 `__ + * - 19-06-2024 + - Decorator implementation across modules, Lazy loading demo + - `Week 3 `__ + * - 30-06-2024 + - Decorator implementation fixes + - `Week 4 `__ + * - 01-07-2024 + - Health issues, Lazy loading preparation + - `Week 5 `__ + * - 07-07-2024 + - Lazy loading implementation, Decorator bug fixes + - `Week 6 `__ + * - 15-07-2024 + - Improvements in lazy loading + - `Week 7 `__ + * - 22-07-2024 + - Blog-post migration, GSoC wiki migration + - `Week 8 `__ + * - 29-07-2024 + - Docker research + - `Week 9 `__ + * - 05-08-2024 + - Fixing tutorials for application of keyword-only-decorator + - `Week 10 `__ + * - 12-08-2024 + - Docker PR + - `Week 11 `__ + * - 19-08-2024 + - Final week + - `Week 12 `__