breaking-the-reclustering-barrier

Code and pre-trained models for the paper "Breaking the Reclustering Barrier in Centroid-based Deep Clustering"

https://github.com/probabilistic-and-interactive-ml/breaking-the-reclustering-barrier

Science Score: 67.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 1 DOI reference(s) in README
  • Academic publication links
    Links to: arxiv.org, zenodo.org
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (15.1%) to scientific vocabulary
Last synced: 8 months ago · JSON representation ·

Repository

Code and pre-trained models for the paper "Breaking the Reclustering Barrier in Centroid-based Deep Clustering"

Basic Info
  • Host: GitHub
  • Owner: Probabilistic-and-Interactive-ML
  • Language: Python
  • Default Branch: main
  • Size: 1.26 MB
Statistics
  • Stars: 7
  • Watchers: 3
  • Forks: 0
  • Open Issues: 1
  • Releases: 0
Created over 1 year ago · Last pushed about 1 year ago
Metadata Files
Readme Citation

README.md

Results

Python Versions License Code Style

BRB: Breaking the Reclustering Barrier

Paper | Accepted at ICLR 2025 | CIFAR10 Clustering | CIFAR100-20 Clustering | Pretrained SimCLR Models | Citation

Introduction

This is the codebase accompanying our paper on "Breaking the Reclustering Barrier" (BRB). To summarize, BRB prevents early performance plateaus in centroid-based deep clustering by periodically applying a soft reset to the feature encoder with subsequent reclustering. This allows the model to escape local minima and continue learning. We show that BRB significantly improves the performance of centroid-based deep clustering algorithms on various datasets and tasks.

Algorithms and data sets

Implemented clustering algorithms

Our repo contains a BRB implementation on top of the following algorithms:

Implemented data sets

Our repo contains training code for the following data sets:

  • MNIST
  • FashionMNIST
  • KMNIST
  • USPS
  • GTSRB
  • OPTDIGITS
  • CIFAR10
  • CIFAR100-20

Pretrained Models

We provide our pretrained SimCLR ResNet-18 models for CIFAR10 and CIFAR100-20 in the table below. The folders contain Pytorch weights for all 10 seeds used to generate the results in the paper. For the hyperparameters, please refer to the paper or the configs folder.

| Dataset | Models | | :--- | :--- | | CIFAR10 | http://e.pc.cd/eGjy6alK | | CIFAR100-20 | http://e.pc.cd/Yrjy6alK |

The k-Means accuracy of these models is reported in the results section.

Installation instructions

Pip

You can install the BRB package and dependencies via pip:

bash pip install -e .

Conda

  1. Clone the repo.
  2. Install the environment

    bash conda env create -f environment.yml

Troubleshooting

In case you get an error with threadpoolctl you need to reinstall it with

bash pip uninstall threadpoolctl && pip install threadpoolctl

Usage

Configuration

We use a hierarchical configuration based on tyro. This allows specification of values in the config as well as overwriting them via the CLI. Lastly, it provides a more enjoyable development experience by providing autocomplete. All configurations are stored in the configs folder.

Single runs

The configuration for a single run is in configs/base_config.py. An example call overwriting a number of parameters is:

bash python train.py --experiment.track-wandb=False --pretrain_epochs=1 --brb.reset_interval=10 --brb.reset_interpolation_factor=0.9 --dc_algorithm="dec" --clustering_epochs=20 --brb.reset_weights=True --dc_optimizer.lr=0.0001 --dc_optimizer.weight_decay=0.1 --dc_optimizer.optimizer=adam --activation_fn="relu" --dataset_name="usps"

Batched runs

A batch of experiments to be run in parallel can be configured with the runner config in config/runner_config.py. Per convention, the runner will iterate over parameter lists that are given as tuple. Configs for multiple experiments can be added to the Configs dictionary and run with:

bash python runner.py idec_cifar10 --experiment.track_wandb=False

Here idec_cifar10 specifies the name of the configuration to run from the Configs dictionary. As is done above, it is still possible to override parameters from the CLI. The runner will recursively glob all files in the config folder to discover configurations.

SLURM integration

We provide a script to run the experiments on a SLURM cluster that allows overriding of the runner configuration depending on the hardware setup. You can execute the script with:

bash submit_sbatch.py

Adapting BRB to other algorithms

BRB consists of three components that must be implemented when using it with an arbitrary centroid-based clustering algorithm:

  1. Soft reset
    A mechanism to (partially) apply a soft reset to the network. Our code is provided in src/deep/soft_reset.py.
  2. Reclustering
    An algorithm for clustering the data after the reset. Our code uses k-means for reclustering because the centroid-based algorithms we use are based on k-means. However, this can be replaced with a clustering algorithm that is more suited to the application at hand. In src/deep/_clustering_utils.py, we implement the following clustering algorithms: random, k-means, k-means++-init, k-medoids, and expectation maximization.
  3. Momentum resets
    As last step of BRB, one has to reset the momentum terms for the centroids.

Once these components are implemented, one can use BRB with any centroid-based clustering algorithm by periodically applying them.

The two most important hyperparameters of BRB are the reset interval $T$ and the reset interpolation factor $\alpha$. The reset interval determines the frequency with which BRB is applied, while the reset interpolation factor determines the strength of the network reset. For the feed forward autoencoder our default values for these hyperparameters, $T=20$ and $\alpha=0.8$, should provide a good starting point. For the ResNet18, we used $T=10$ and set $\alpha=0.7$ for the MLP encoder and $\alpha=0.9$ for the last ResNet block.

Logging

Per default, our code will log various training metrics using Weights & Biases. This allows to track experiments and compare results easily. For paper-quality plots with exact numbers, one has to first download the data from the Weights & Biases server:

bash python wandb_downloader.py

The data is stored in three DataFrames: pretrain metrics, clustering metrics, and test metrics. These can then be used to generate plots.

The downloader is flexible and can be configured in multiple ways:

  • HYPERPARAMS is a set containing the hyperparameters that are downloaded with the train metrics. These allow for filtering and aggregating the data later.
  • DownloadArgs is a configuration file that specifies the wandb user, project, and metrics to download. It defaults to the currently logged in user.
  • One can choose to download only runs that satisfy certain critera using the FILTERS set. Details on how to configure these can be found in the downloader script.

[!CAUTION]

Expensive metrics

Certain metrics are expensive to compute and will significantly slow down the code when logged. These are:

  • Purity (most significant slowdown)
  • Voronoi plots
  • Uncertainty plots

Results

Results

Autoencoder results

Results for DEC and IDEC with and without BRB using a Feed Forward Autoencoder. The full results table can be found here.

AE Results

Contrastive Learning

Results for DEC, IDEC, and DCN with and without BRB using a ResNet18 encoder.

AE Results

Acknowledgements

Our code builds on ClustPy, which provided us with implementations for the clustering algorithms. We modified their code to fit our needs and added the BRB method. For self-labeling we used the SCAN repository and applied it to our models. We would like to thank the authors for their work.

Citation

If you use our code or pretrained models for your research, please cite our paper:

bibtex @article{miklautz2024breaking, title={Breaking the Reclustering Barrier in Centroid-based Deep Clustering}, author={Miklautz, Lukas and Klein, Timo and Sidak, Kevin and Leiber, Collin and Lang, Thomas and Shkabrii, Andrii and Tschiatschek, Sebastian and Plant, Claudia}, journal={arXiv preprint arXiv:2411.02275}, year={2024} }

Owner

  • Name: Probabilistic and Interactive ML
  • Login: Probabilistic-and-Interactive-ML
  • Kind: organization

Citation (CITATION.cff)

cff-version: 1.2.0
message: "If you use our codebase, please cite our paper."
type: article
authors:
- family-names: "Miklautz"
  given-names: "Lukas"
- family-names: "Klein"
  given-names: "Timo"
- family-names: "Sidak"
  given-names: "Kevin"
- family-names: "Tschiatschek"
  given-names: "Sebastian"
- family-names: "Plant"
  given-names: "Claudia"
title: "Breaking the Reclustering Barrier in Centroid-based Deep Clustering"
doi:  10.48550/arXiv.2411.02275
url: "https://github.com/Probabilistic-and-Interactive-ML/breaking-the-reclustering-barrier"
year: 2024

GitHub Events

Total
  • Issues event: 1
  • Watch event: 10
  • Issue comment event: 5
  • Push event: 6
  • Pull request event: 2
  • Create event: 2
Last Year
  • Issues event: 1
  • Watch event: 10
  • Issue comment event: 5
  • Push event: 6
  • Pull request event: 2
  • Create event: 2

Issues and Pull Requests

Last synced: 8 months ago

All Time
  • Total issues: 1
  • Total pull requests: 1
  • Average time to close issues: N/A
  • Average time to close pull requests: 11 days
  • Total issue authors: 1
  • Total pull request authors: 1
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.0
  • Merged pull requests: 1
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 1
  • Pull requests: 1
  • Average time to close issues: N/A
  • Average time to close pull requests: 11 days
  • Issue authors: 1
  • Pull request authors: 1
  • Average comments per issue: 0.0
  • Average comments per pull request: 0.0
  • Merged pull requests: 1
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • NielsRogge (1)
Pull Request Authors
  • timoklein (1)
Top Labels
Issue Labels
Pull Request Labels

Dependencies

pyproject.toml pypi
setup.py pypi
  • anyio ==4.4.0
  • argon2-cffi ==23.1.0
  • arrow ==1.3.0
  • attrs ==24.2.0
  • babel ==2.14.0
  • beautifulsoup4 ==4.12.3
  • bleach ==6.1.0
  • cffi ==1.17.0
  • charset-normalizer ==3.3.2
  • click ==8.1.7
  • colorama ==0.4.6
  • contourpy ==1.3.0
  • cycler ==0.12.1
  • debugpy ==1.8.5
  • decorator ==5.1.1
  • defusedxml ==0.7.1
  • docker-pycreds ==0.4.0
  • docstring_parser ==0.16
  • einops ==0.8.0
  • entrypoints ==0.4
  • exceptiongroup ==1.2.2
  • executing ==2.0.1
  • fastjsonschema ==2.20.0
  • ffmpeg ==1.4
  • filelock ==3.13.1
  • fonttools ==4.53.1
  • frozendict ==2.4.4
  • gitpython ==3.1.43
  • h11 ==0.14.0
  • httpcore ==1.0.5
  • httpx ==0.27.2
  • idna ==3.8
  • importlib-metadata ==8.4.0
  • importlib_resources ==6.4.4
  • ipdb ==0.13.13
  • ipykernel ==6.29.5
  • ipython ==8.27.0
  • jedi ==0.19.1
  • jinja2 ==3.1.4
  • joblib ==1.4.2
  • jsonschema ==4.23.0
  • kiwisolver ==1.4.5
  • markdown-it-py ==3.0.0
  • markupsafe ==2.1.5
  • matplotlib ==3.9.2
  • mistune ==3.0.2
  • nbclient ==0.10.0
  • nbconvert ==7.16.4
  • nbformat ==5.10.4
  • nest-asyncio ==1.6.0
  • networkx ==3.3
  • nltk ==3.9.1
  • numba ==0.60.0
  • numpy ==1.26.4
  • packaging ==24.1
  • pandas ==2.2.2
  • parso ==0.8.4
  • patsy ==0.5.6
  • pexpect ==4.9.0
  • pickleshare ==0.7.5
  • pillow ==10.4.0
  • pip ==24.2
  • platformdirs ==4.2.2
  • prometheus_client ==0.20.0
  • prompt-toolkit ==3.0.47
  • protobuf ==4.25.3
  • psutil ==6.0.0
  • pygments ==2.18.0
  • pynvml ==11.5.3
  • pyparsing ==3.1.4
  • pysocks ==1.7.1
  • python-dateutil ==2.9.0
  • python-json-logger ==2.0.7
  • pytz ==2024.1
  • pyyaml ==6.0.2
  • pyzmq ==26.2.0
  • referencing ==0.35.1
  • regex ==2024.7.24
  • requests ==2.32.3
  • rich ==13.7.1
  • ruff ==0.6.2
  • scikit-learn ==1.2.2
  • scikit-learn-extra ==0.3.0
  • scipy ==1.14.1
  • seaborn ==0.13.2
  • send2trash ==1.8.3
  • setuptools ==72.2.0
  • shortuuid ==1.0.13
  • six ==1.16.0
  • soupsieve ==2.5
  • stack_data ==0.6.2
  • statsmodels ==0.14.2
  • sympy ==1.13.2
  • terminado ==0.18.1
  • threadpoolctl ==3.5.0
  • tinycss2 ==1.3.0
  • torch ==2.4.0
  • torchvision ==0.19.0
  • tqdm ==4.66.5
  • traitlets ==5.14.3
  • typing-extensions ==4.12.2
  • tyro ==0.8.10
  • umap-learn ==0.5.6
  • urllib3 ==2.2.2
  • wandb ==0.16.6
  • wcwidth ==0.2.13
  • webcolors ==24.8.0
  • webencodings ==0.5.1
  • websocket-client ==1.8.0
  • wheel ==0.44.0
  • zipp ==3.20.1
  • zstandard ==0.23.0
environment.yml conda
  • _libgcc_mutex 0.1
  • _openmp_mutex 4.5
  • anyio 4.4.0
  • aom 3.9.1
  • appdirs 1.4.4
  • argon2-cffi 23.1.0
  • argon2-cffi-bindings 21.2.0
  • arrow 1.3.0
  • asttokens 2.4.1
  • async-lru 2.0.4
  • attrs 24.2.0
  • babel 2.14.0
  • beautifulsoup4 4.12.3
  • blas 1.0
  • bleach 6.1.0
  • brotli 1.1.0
  • brotli-bin 1.1.0
  • brotli-python 1.1.0
  • bzip2 1.0.8
  • ca-certificates 2024.8.30
  • cached-property 1.5.2
  • cached_property 1.5.2
  • cairo 1.18.0
  • certifi 2024.7.4
  • cffi 1.17.0
  • charset-normalizer 3.3.2
  • click 8.1.7
  • colorama 0.4.6
  • comm 0.2.2
  • contourpy 1.3.0
  • cuda-cudart 11.8.89
  • cuda-cupti 11.8.87
  • cuda-libraries 11.8.0
  • cuda-nvrtc 11.8.89
  • cuda-nvtx 11.8.86
  • cuda-runtime 11.8.0
  • cuda-version 12.6
  • cycler 0.12.1
  • dav1d 1.2.1
  • debugpy 1.8.5
  • decorator 5.1.1
  • defusedxml 0.7.1
  • docker-pycreds 0.4.0
  • docstring_parser 0.16
  • einops 0.8.0
  • entrypoints 0.4
  • exceptiongroup 1.2.2
  • executing 2.0.1
  • expat 2.6.2
  • ffmpeg 7.0.2
  • filelock 3.13.1
  • font-ttf-dejavu-sans-mono 2.37
  • font-ttf-inconsolata 2.001
  • font-ttf-source-code-pro 2.030
  • font-ttf-ubuntu 0.83
  • fontconfig 2.14.2
  • fonts-anaconda 1
  • fonts-conda-ecosystem 1
  • fonttools 4.53.1
  • fqdn 1.5.1
  • freetype 2.12.1
  • fribidi 1.0.10
  • frozendict 2.4.4
  • gitdb 4.0.11
  • gitpython 3.1.43
  • gmp 6.3.0
  • gmpy2 2.1.2
  • gnutls 3.8.7
  • graphite2 1.3.14
  • h11 0.14.0
  • h2 4.1.0
  • harfbuzz 9.0.0
  • hpack 4.0.0
  • httpcore 1.0.5
  • httpx 0.27.2
  • hyperframe 6.0.1
  • icu 75.1
  • idna 3.8
  • importlib-metadata 8.4.0
  • importlib_metadata 8.4.0
  • importlib_resources 6.4.4
  • intel-openmp 2022.0.1
  • ipdb 0.13.13
  • ipykernel 6.29.5
  • ipython 8.27.0
  • isoduration 20.11.0
  • jedi 0.19.1
  • jinja2 3.1.4
  • joblib 1.4.2
  • json5 0.9.25
  • jsonpointer 3.0.0
  • jsonschema 4.23.0
  • jsonschema-specifications 2023.12.1
  • jsonschema-with-format-nongpl 4.23.0
  • jupyter-lsp 2.2.5
  • jupyter_client 8.6.2
  • jupyter_core 5.7.2
  • jupyter_events 0.10.0
  • jupyter_server 2.14.2
  • jupyter_server_terminals 0.5.3
  • jupyterlab 4.2.5
  • jupyterlab_pygments 0.3.0
  • jupyterlab_server 2.27.3
  • keyutils 1.6.1
  • kiwisolver 1.4.5
  • krb5 1.21.3
  • lame 3.100
  • lcms2 2.16
  • ld_impl_linux-64 2.40
  • lerc 4.0.0
  • libabseil 20240116.2
  • libass 0.17.3
  • libblas 3.9.0
  • libbrotlicommon 1.1.0
  • libbrotlidec 1.1.0
  • libbrotlienc 1.1.0
  • libcblas 3.9.0
  • libcublas 11.11.3.6
  • libcufft 10.9.0.58
  • libcufile 1.11.1.6
  • libcurand 10.3.7.68
  • libcusolver 11.4.1.48
  • libcusparse 11.7.5.86
  • libdeflate 1.21
  • libdrm 2.4.123
  • libedit 3.1.20191231
  • libexpat 2.6.2
  • libffi 3.4.2
  • libgcc 14.1.0
  • libgcc-ng 14.1.0
  • libgfortran 14.1.0
  • libgfortran-ng 14.1.0
  • libgfortran5 14.1.0
  • libglib 2.80.3
  • libgomp 14.1.0
  • libhwloc 2.11.1
  • libiconv 1.17
  • libidn2 2.3.4
  • libjpeg-turbo 3.0.0
  • liblapack 3.9.0
  • libllvm14 14.0.6
  • libnpp 11.8.0.86
  • libnsl 2.0.1
  • libnvjpeg 11.9.0.86
  • libopenblas 0.3.27
  • libopenvino 2024.3.0
  • libopenvino-auto-batch-plugin 2024.3.0
  • libopenvino-auto-plugin 2024.3.0
  • libopenvino-hetero-plugin 2024.3.0
  • libopenvino-intel-cpu-plugin 2024.3.0
  • libopenvino-intel-gpu-plugin 2024.3.0
  • libopenvino-intel-npu-plugin 2024.3.0
  • libopenvino-ir-frontend 2024.3.0
  • libopenvino-onnx-frontend 2024.3.0
  • libopenvino-paddle-frontend 2024.3.0
  • libopenvino-pytorch-frontend 2024.3.0
  • libopenvino-tensorflow-frontend 2024.3.0
  • libopenvino-tensorflow-lite-frontend 2024.3.0
  • libopus 1.3.1
  • libpciaccess 0.18
  • libpng 1.6.43
  • libprotobuf 4.25.3
  • libsodium 1.0.18
  • libsqlite 3.46.0
  • libstdcxx 14.1.0
  • libstdcxx-ng 14.1.0
  • libtasn1 4.19.0
  • libtiff 4.6.0
  • libunistring 0.9.10
  • libunwind 1.6.2
  • libuuid 2.38.1
  • libva 2.22.0
  • libvpx 1.14.1
  • libwebp-base 1.4.0
  • libxcb 1.16
  • libxcrypt 4.4.36
  • libxml2 2.12.7
  • libzlib 1.3.1
  • llvm-openmp 15.0.7
  • llvmlite 0.43.0
  • markdown-it-py 3.0.0
  • markupsafe 2.1.5
  • matplotlib-base 3.9.2
  • matplotlib-inline 0.1.7
  • mdurl 0.1.2
  • mistune 3.0.2
  • mkl 2022.1.0
  • mpc 1.1.0
  • mpfr 4.0.2
  • mpmath 1.3.0
  • munkres 1.1.4
  • nbclient 0.10.0
  • nbconvert-core 7.16.4
  • nbformat 5.10.4
  • ncurses 6.5
  • nest-asyncio 1.6.0
  • nettle 3.9.1
  • networkx 3.3
  • nltk 3.9.1
  • notebook-shim 0.2.4
  • numba 0.60.0
  • numpy 1.26.4
  • ocl-icd 2.3.2
  • openh264 2.4.1
  • openjpeg 2.5.2
  • openssl 3.3.1
  • overrides 7.7.0
  • p11-kit 0.24.1
  • packaging 24.1
  • pandas 2.2.2
  • pandocfilters 1.5.0
  • parso 0.8.4
  • patsy 0.5.6
  • pcre2 10.44
  • pexpect 4.9.0
  • pickleshare 0.7.5
  • pillow 10.4.0
  • pip 24.2
  • pixman 0.43.2
  • pkgutil-resolve-name 1.3.10
  • platformdirs 4.2.2
  • prometheus_client 0.20.0
  • prompt-toolkit 3.0.47
  • protobuf 4.25.3
  • psutil 6.0.0
  • pthread-stubs 0.4
  • ptyprocess 0.7.0
  • pugixml 1.14
  • pure_eval 0.2.3
  • py-spy 0.3.14
  • pycparser 2.22
  • pygments 2.18.0
  • pynndescent 0.5.13
  • pynvml 11.5.3
  • pyparsing 3.1.4
  • pysocks 1.7.1
  • python 3.11.9
  • python-dateutil 2.9.0
  • python-fastjsonschema 2.20.0
  • python-json-logger 2.0.7
  • python-tzdata 2024.1
  • python_abi 3.11
  • pytorch 2.4.0
  • pytorch-cuda 11.8
  • pytorch-mutex 1.0
  • pytz 2024.1
  • pyyaml 6.0.2
  • pyzmq 26.2.0
  • qhull 2020.2
  • readline 8.2
  • referencing 0.35.1
  • regex 2024.7.24
  • requests 2.32.3
  • rfc3339-validator 0.1.4
  • rfc3986-validator 0.1.1
  • rich 13.7.1
  • rpds-py 0.20.0
  • ruff 0.6.2
  • scikit-learn 1.2.2
  • scikit-learn-extra 0.3.0
  • scipy 1.14.1
  • seaborn 0.13.2
  • seaborn-base 0.13.2
  • send2trash 1.8.3
  • sentry-sdk 2.13.0
  • setproctitle 1.3.3
  • setuptools 72.2.0
  • shortuuid 1.0.13
  • shtab 1.7.1
  • six 1.16.0
  • smmap 5.0.0
  • snappy 1.2.1
  • sniffio 1.3.1
  • soupsieve 2.5
  • stack_data 0.6.2
  • statsmodels 0.14.2
  • svt-av1 2.2.1
  • sympy 1.13.2
  • tbb 2021.12.0
  • terminado 0.18.1
  • threadpoolctl 3.5.0
  • tinycss2 1.3.0
  • tk 8.6.13
  • toml 0.10.2
  • tomli 2.0.1
  • torchaudio 2.4.0
  • torchtriton 3.0.0
  • torchvision 0.19.0
  • tornado 6.4.1
  • tqdm 4.66.5
  • traitlets 5.14.3
  • types-python-dateutil 2.9.0.20240821
  • typing-extensions 4.12.2
  • typing_extensions 4.12.2
  • typing_utils 0.1.0
  • tyro 0.8.10
  • tzdata 2024a
  • umap-learn 0.5.6
  • uri-template 1.3.0
  • urllib3 2.2.2
  • wandb 0.16.6
  • wayland 1.23.1
  • wayland-protocols 1.36
  • wcwidth 0.2.13
  • webcolors 24.8.0
  • webencodings 0.5.1
  • websocket-client 1.8.0
  • wheel 0.44.0
  • x264 1!164.3095
  • x265 3.5
  • xorg-fixesproto 5.0
  • xorg-kbproto 1.0.7
  • xorg-libice 1.1.1
  • xorg-libsm 1.2.4
  • xorg-libx11 1.8.9
  • xorg-libxau 1.0.11
  • xorg-libxdmcp 1.1.3
  • xorg-libxext 1.3.4
  • xorg-libxfixes 5.0.3
  • xorg-libxrender 0.9.11
  • xorg-renderproto 0.11.1
  • xorg-xextproto 7.3.0
  • xorg-xproto 7.0.31
  • xz 5.2.6
  • yaml 0.2.5
  • zeromq 4.3.5
  • zipp 3.20.1
  • zlib 1.3.1
  • zstandard 0.23.0
  • zstd 1.5.6