v1.2.6, 01.03.2016 -- First tracked release
v1.3.0, 03.03.2016 -- Added plot module
v1.5.0, 11.03.2016 -- Changed package architecture to one submodules in modlamp
v2.0.4  17.03.2016 -- Updated docs and AA probabilities, added capability of reading sequences from numpy.ndarrays
v2.0.5  17.03.2016 -- Added new sequences dataset to be loaded: ``load_helicalAMPset()``
v2.1.0  17.03.2016 -- Added example script of usage and corrected some behaviour of core functions.
v2.1.1  22.03.2016 -- Fixed different docstrings, added methods to load and save descriptor data
v2.1.2  22.03.2016 -- New Documentation reference and file names
v2.1.3  23.03.2016 -- Added filtering methods for amino acids and descriptor values, as well as test cases
v2.1.4  31.03.2016 -- New function to query experimental data from the peptides database
v2.1.5  08.04.2016 -- Helical wheel plot function added to modlamp.plot
v2.1.6  07.06.2016 -- Saving Fasta files from descriptors, bug fixes
v2.2.0  08.06.2016 -- ML Module for SVM and RF added
v2.2.1  15.06.2016 -- PDE plot function plot_pde() added to modlab.plot
v2.2.2  17.06.2016 -- Violin plot function plot_violin() added to modlab.plot
v2.2.3  20.06.2016 -- random_selection() method to select a random number of sequences and descriptors from instance
v2.2.4  20.06.2016 -- filter_sequences() method to filter out specific sequences with corresponding values
v2.2.5  22.06.2016 -- new plot method to plot amino acid distributions: plot_aa_distr()
v2.2.6  08.07.2016 -- code refactoring according to PEP8 and simplification of core functions
v2.3.0  13.07.2016 -- new parallel calculation of auto- and cross-correlated descriptors
v2.3.1  25.07.2016 -- new sequences class Hepahelices for generating amphipathic sequences with a heparin-binding-domain
v2.4.0  22.08.2016 -- new module wetlab with class CD for analysis and plotting of circular dichroism data
v2.4.1  14.09.2016 -- new sequence class AMPngrams for generating sequences out of frequent APD3 ngrams
v2.5.0  23.09.2016 -- clarified documentation and replaced Biopython functions by own code
v2.5.1  17.10.2016 -- bug fixes in documentation
v2.6.0  17.11.2016 -- New module "analysis" with summary_plot method to show an overview of different peptide libraries
v2.6.1  29.11.2016 -- Some changes in README and setup.py to make modlAMP PyPI compatible
v2.6.2  18.12.2016 -- Updated data sets for publication, version uploaded to ETH data archive
v2.6.3  19.12.2016 -- Initial upload to PyPI
v2.6.4  11.01.2017 -- Bugfix in GlobalDescriptor.instability_index
v2.6.5  12.01.2017 -- Added 'all' option for combining all AA scales
v2.6.6  12.01.2017 -- Requirements corrected in setup.py
v2.6.7  12.01.2017 -- Requirements again corrected in setup.py
v2.7.0  16.01.2017 -- Adapted modlamp.wetlab.CD to recognize same squences instead of names for combination plots
v2.7.1  16.01.2017 -- Hydrophobic moment arrow option added to helical_wheel function
v2.7.2  19.01.2017 -- Slight visual adaptions in helical_wheel output
v2.7.3  30.01.2017 -- Small bug fix in ml module and clarification of documentation in ML module
v2.7.4  14.03.2017 -- Adapted CD plot function in wetlab to take ylim argument, bug fix in y axis label
v2.7.5  22.03.2017 -- New CD plot function to plot combined plots of all data
v2.7.6  23.03.2017 -- Added GlobalDescriptor.formula method to calculate the molecular formula of peptides, bugfix in calculate_all()
v2.7.7  28.03.2017 -- Removed sequences containing unnatural amino acids from the AMPvsUniProt dataset
v2.7.8  30.03.2017 -- Bug fixes and code simplifications in the ml module
v3.0.0  30.03.2017 -- Refactoring of modlamp.sequences module. All classes now share the method generate_sequences()
v3.0.1  13.04.2017 -- New unittests for the modlamp.ml module.
v3.1.0  04.05.2017 -- Publication referenced. Adaptions in CD descriptions and README
v3.1.1  15.05.2017 -- Bugfix in cv function and wetlab test case
v3.1.2  07.06.2017 -- Color option added in analysis plot, bugfix in .csv file reading
v3.2.0  23.06.2017 -- Bugfixes when plotting GlobalAnalysis summary, reorganization of AA probabilities in core module
v3.2.1  05.07.2017 -- Move to pypi.org
v3.2.2  14.07.2017 -- Change references to documentation and move it to http://modlamp.org
v3.2.3  11.09.2017 -- Improve Python3 compatibility, change bugs in bin scripts, optimize save_fasta method
v3.2.4  15.09.2017 -- Import bug fix
v3.3.0  27.09.2017 -- New descriptor pepArc, bugfix in AmphipathicArc, removed short sequences from AMPvsUniProt
v3.3.1  19.10.2017 -- Bugfixes in pepArc, random ACP probability added to sequences.Random
v3.3.2  21.12.2017 -- New options in pepArc, cleaning AMPngrams
v3.4.0  07.02.2018 -- New tests, removed biopython dependency, travis build and codecov added
v3.4.1  17.11.2018 -- Bugfix for installing via new pip versions
v3.4.2  10.12.2018 -- Bugfix for GlobalAnalysis if library contains sublibraries
v3.4.3  10.12.2018 -- Bugfix in installation
v4.0.0  13.02.2019 -- Migrating modlAMP to Python3!
v4.0.1  03.03.2019 -- Bugfix in calculate_profile
v4.0.2  29.03.2019 -- n-gram calculation and new tests
v4.0.3  05.05.2019 -- Bugfix in plot functions
v4.0.4  03.06.2019 -- Python3 bug fix in HelicesACP
v4.1.0  05.06.2019 -- Fully Python3 compatible
v4.1.1  15.07.2019 -- Bugfix in AA formula
v4.1.2  13.11.2019 -- Bugfix in GlobalAnalysis plot
v4.1.3  13.11.2019 -- Another bugfix in GlobalAnalysis plot
v4.1.4  29.04.2020 -- Added dunder info (all, author, version)
v4.2.0  04.06.2020 -- Compatibility with newest scikit-learn version
v4.2.1  12.06.2020 -- Bugfix in plot_aa_distr
v4.2.2  17.06.2020 -- Bugfix for Bioconda, pip internal function
v4.2.3  15.10.2020 -- Bugfix in GlobalAnalysis charge plot
v4.3.0  25.02.2021 -- Correction in GlobalDescriptor documentation and analysis bug fixed
v4.3.1  14.03.2025 -- Linting and fixing unicode b-string issue when saving descriptor
v4.3.2  22.09.2026 -- Full-repository bug-fix review. Corrections that change returned values:
                      * read_fasta() identified the last record by line content, so files containing
                        a repeated sequence lost or duplicated records and mis-paired sequences with
                        names
                      * count_ngrams() used str.count() and therefore missed overlapping occurrences
                        (poly-K/R/G stretches were systematically under-counted)
                      * MixedLibrary passed (seqnum, lenmin, lenmax) in the wrong order to Helices,
                        Kinked, Oblique and Random: wrong library size, sequence lengths outside the
                        documented 7-28 range, empty sub-libraries and incorrect class labels
                      * save_descriptor() wrote only the first letter of every feature name
                      * load_descriptordata(targets=True) left the target column in the descriptor
                      * charge_density(append=True) discarded previously calculated features
                      * calculate_moment()/calculate_global() never reset all_moms/all_globs, so
                        calculate_profile() could fit stale values from an earlier call
                      * _one_arc() skipped the C-terminal window of sequences longer than 18 residues
                      * isoelectric_point() leaked its bisection brackets between sequences
                      * minmax_selection() recorded indices after deleting from the pool (wrong
                        sequences returned) and overwrote target with descriptor data
                      * ml.score_cv()/score_testset() computed ROC-AUC from predicted class labels
                        instead of continuous scores, and score_cv() included the "mean" column when
                        computing "std"
                      Robustness and errors:
                      * calculate_moment() on a multi-dimensional scale, and an unknown "modality",
                        now raise ValueError instead of crashing inside NumPy or returning zeros
                      * BaseDescriptor() raises ValueError on empty or unreadable input instead of
                        printing and returning a half-initialised object; lower-case sequences accepted
                      * filter_duplicates() works on instances that have descriptors
                      Compatibility with NumPy >= 2, pandas >= 1, scikit-learn >= 1.0, matplotlib >= 3.9
                      and SciPy >= 1.11 (random_integers, get_values, validation_curve keyword-only
                      arguments, StratifiedKFold random_state, boxplot tick_labels, Axes3D tick
                      positions, scipy.stats.kde).
                      Packaging: mysql-connector-python moved to the optional "database" extra, the
                      packaged db_config.json is resolved relative to the module instead of the working
                      directory, version.py corrected to match setup.py, classifiers updated to
                      Python 3.10-3.13, nose dropped.
                      BREAKING: all charge-dependent descriptors (calculate_charge, charge_density,
                      isoelectric_point, calculate_all, GlobalAnalysis.calc_charge) now share the
                      defaults pH 7.4 and amide=True, exposed as modlamp.descriptors.DEFAULT_PH and
                      DEFAULT_AMIDE. calculate_charge() returned 0.996 for GLFDIVKKVVGALG in v4.3.1
                      and returns 1.989 from v4.3.2 on. Pass ph= and amide= explicitly to pin the
                      conditions you want.
                      NOTE: v4.3.2 was never published to PyPI -- the 4.3.2 artifact there predates this
                      review. All of the above first ships in v4.3.3.
v4.3.3  22.09.2026 -- Centrosymmetric.generate_sequences(symmetry="asymmetric") could return symmetric
                      sequences. Each seven-residue block was drawn independently and the amino acid
                      alphabets allow only 150 distinct blocks, so two blocks coincided in ~0.7 % of
                      sequences (1.9 % of the three-block ones contained a repeat). Blocks are now
                      drawn until they are pairwise distinct, as the class documentation specifies.
