# Jenetics

![Build Status](https://github.com/jenetics/jenetics/actions/workflows/gradle.yml/badge.svg)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.jenetics/jenetics/badge.svg)](http://search.maven.org/#search|ga|1|a%3A%22jenetics%22)
[![Javadoc](https://www.javadoc.io/badge/io.jenetics/jenetics.svg)](http://www.javadoc.io/doc/io.jenetics/jenetics)

**Jenetics** is a **Genetic Algorithm**, **Evolutionary Algorithm**, **Grammatical Evolution**, **Genetic Programming**, and **Multi-objective Optimization** library, written in modern day Java. It is designed with a clear separation of the several concepts of the algorithm, e.g. `Gene`, `Chromosome`, `Genotype`, `Phenotype`, `Population` and fitness `Function`. **Jenetics** allows you to minimize and maximize the given fitness function without tweaking it. In contrast to other GA implementations, the library uses the concept of an evolution stream (`EvolutionStream`) for executing the evolution steps. Since the `EvolutionStream` implements the Java Stream interface, it works smoothly with the rest of the Java Stream API.

**Other languages**

* [**Jenetics.Net**](https://github.com/rmeindl/jenetics.net): Experimental .NET Core port in C# of the base library.
* [**Helisa**](https://github.com/softwaremill/helisa/): Scala wrapper around the Jenetics library.

## Documentation

The library is fully documented ([javadoc](https://jenetics.io/javadoc/combined/8.0/index.html)) and comes with a user manual ([pdf](http://jenetics.io/manual/manual-8.0.0.pdf)).

## Build Jenetics

**Jenetics** requires at least **Java 21** to compile and run.

Check out the master branch from GitHub.

    $ git clone https://github.com/jenetics/jenetics.git <builddir>

Jenetics uses [Gradle](http://www.gradle.org/downloads) as build system and organizes the source into *sub*-projects (modules). Each subproject is located in its own subdirectory:

**Published projects**

The following projects/modules are also published to Maven.

* **[jenetics](jenetics)** [![Javadoc](https://www.javadoc.io/badge/io.jenetics/jenetics.svg)](http://www.javadoc.io/doc/io.jenetics/jenetics): This project contains the source code and tests for the Jenetics core-module.
* **[jenetics.ext](jenetics.ext)** [![Javadoc](https://www.javadoc.io/badge/io.jenetics/jenetics.svg)](http://www.javadoc.io/doc/io.jenetics/jenetics.ext): This module contains additional _non_-standard GA operations and data types. It also contains classes for solving multi-objective problems (MOEA) and doing Grammatical Evolution (GE).
* **[jenetics.prog](jenetics.prog)** [![Javadoc](https://www.javadoc.io/badge/io.jenetics/jenetics.svg)](http://www.javadoc.io/doc/io.jenetics/jenetics.prog): The modules contains classes which allows to do genetic programming (GP). It seamlessly works with the existing `EvolutionStream` and evolution `Engine`.
* **[jenetics.xml](jenetics.xml)** [![Javadoc](https://www.javadoc.io/badge/io.jenetics/jenetics.svg)](http://www.javadoc.io/doc/io.jenetics/jenetics.xml): XML marshalling module for the _Jenetics_ base data structures.

**Non-published projects**

* **jenetics.example**: This project contains example code for the *core*-module.
* **jenetics.doc**: Contains the code of the web-site and the manual.
* **jenetics.tool**: This module contains classes used for doing integration testing and algorithmic performance testing. It is also used for creating GA performance measures and creating diagrams from the performance measures.

For building the library change into the `<builddir>` directory (or one of the module directories) and call one of the available tasks:

* **compileJava**: Compiles the Jenetics sources and copies the class files to the `<builddir>/<module-dir>/build/classes/main` directory.
* **jar**: Compiles the sources and creates the JAR files. The artifacts are copied to the `<builddir>/<module-dir>/build/libs` directory.
* **javadoc**: Generates the API documentation. The Javadoc is stored in the `<builddir>/<module-dir>/build/docs` directory
* **test**: Compiles and executes the unit tests. The test results are printed onto the console, and a test-report, created by TestNG, is written to `<builddir>/<module-dir>` directory.
* **clean**: Deletes the `<builddir>/build/*` directories and removes all generated artifacts.

For building the library jar from the source call

    $ cd <build-dir>
    $ ./gradlew jar

## Example

### Hello World (Ones counting)

The minimum evolution Engine setup needs a genotype factory, `Factory<Genotype<?>>`, and a fitness `Function`. The `Genotype` implements the `Factory` interface and can therefore be used as prototype for creating the initial `Population` and for creating new random `Genotypes`.

```java
import io.jenetics.BitChromosome;
import io.jenetics.BitGene;
import io.jenetics.Genotype;
import io.jenetics.engine.Engine;
import io.jenetics.engine.EvolutionResult;
import io.jenetics.util.Factory;

public class HelloWorld {
    // 2.) Definition of the fitness function.
    private static Integer eval(Genotype<BitGene> gt) {
        return gt.chromosome()
            .as(BitChromosome.class)
            .bitCount();
    }

    public static void main(String[] args) {
        // 1.) Define the genotype (factory) suitable
        //     for the problem.
        Factory<Genotype<BitGene>> gtf =
            Genotype.of(BitChromosome.of(10, 0.5));

        // 3.) Create the execution environment.
        Engine<BitGene, Integer> engine = Engine
            .builder(HelloWorld::eval, gtf)
            .build();

        // 4.) Start the execution (evolution) and
        //     collect the result.
        Genotype<BitGene> result = engine.stream()
            .limit(100)
            .collect(EvolutionResult.toBestGenotype());

        System.out.println("Hello World:\n" + result);
    }
}
```

In contrast to other GA implementations, the library uses the concept of an evolution stream (`EvolutionStream`) for executing the evolution steps. Since the `EvolutionStream` implements the Java Stream interface, it works smoothly with the rest of the Java streaming API. Now let's have a closer look at the listing above and discuss this simple program step by step:

1. The probably most challenging part, when setting up a new evolution `Engine`, is to transform the problem domain into a appropriate `Genotype` (factory) representation. In our example we want to count the number of ones of a `BitChromosome`. Since we are counting only the ones of one chromosome, we are adding only one `BitChromosome` to our `Genotype`. In general, the `Genotype` can be created with 1 to n chromosomes.

2. Once this is done, the fitness function, which should be maximized, can be defined. Utilizing the new language features introduced in Java 8, we simply write a private static method, which takes the genotype we defined and calculates its fitness value. If we want to use the optimized bit-counting method, `bitCount()`, we have to cast the `Chromosome<BitGene>` class to the actual used `BitChromosome` class. Since we know for sure that we created the Genotype with a `BitChromosome`, this can be done safely. A reference to the eval method is then used as fitness function and passed to the `Engine.build` method.

3. In the third step we are creating the evolution `Engine`, which is responsible for changing, respectively evolving, a given population. The `Engine` is highly configurable and takes parameters for controlling the evolutionary and the computational environment. For changing the evolutionary behavior, you can set different alterers and selectors. By changing the used `Executor` service, you control the number of threads; the Engine is allowed to use. A new `Engine` instance can only be created via its builder, which is created by calling the `Engine.builder` method.

4. In the last step, we can create a new `EvolutionStream` from our `Engine`. The `EvolutionStream` is the model or view of the evolutionary process. It serves as a »process handle« and also allows you, among other things, to control the termination of the evolution. In our example, we simply truncate the stream after 100 generations. If you don't limit the stream, the `EvolutionStream` will not terminate and run forever. Since the `EvolutionStream` extends the `java.util.stream.Stream` interface, it integrates smoothly with the rest of the Java Stream API. The final result, the best `Genotype` in our example, is then collected with one of the predefined collectors of the `EvolutionResult` class.

### Evolving images

This example tries to approximate a given image by semitransparent polygons.  It comes with a Swing UI, where you can immediately start your own experiments. After compiling the sources with

    $ ./gradlew compileTestJava

you can start the example by calling

    $ ./jrun io.jenetics.example.image.EvolvingImages

![Evolving images](https://raw.githubusercontent.com/jenetics/jenetics/master/jenetics.doc/src/main/resources/graphic/EvolvingImagesExampleScreenShot.png)

The previous image shows the GUI after evolving the default image for about 4,000 generations. With the »Open« button, it is possible to load other images for polygonization. The »Save« button allows storing polygonized images in PNG format to disk. At the button of the UI, you can change some GA parameters of the example.

## Projects using Jenetics

* SPEAR: SPEAR (Smart Prognosis of Energy with Allocation of Resources) created an extendable platform for energy and efficiency optimizations of production systems.
* Renaissance Suite: Renaissance is a modern, open, and diversified benchmark suite for the JVM, aimed at testing JIT compilers, garbage collectors, profilers, analyzers and other tools.
* APP4MC: Eclipse APP4MC is a platform for engineering embedded multi- and many-core software systems.

## Blogs and articles

* Schachprobleme komponieren mit evolutionären Algorithmen, by Jakob Leck, Dec 2023, Die Schwalbe 324-2, pp. 373-380. Composition and solving chess problems with a greater number of peaces than usual. Instead of a brute force approach, a GA is used solving the problems (German).
* Solving the Knapsack Problem with the Jenetics Library, by Craftcode Crew, May 13, 2021
* 一种基于Jenetics的遗传算法程序设计, 电脑知识与技术 2018年22期 by 王康, Nov. 26. 2018
* Introduction to Jenetics Library, by baeldung, April 11. 2017
* How to Solve Tough Problems Using Genetic Algorithms, by Tzofia Shiftan, April 6. 2017
* Genetic algorithms with Java, by William Antônio, January 10. 2017
* Jenetics 설치 및 예제, by JDM, May 8. 2015
* 유전 알고리즘 (Genetic Algorithms), by JDM, April 2. 2015

## Citations

Bernhard J. Berger; Christina Plump; Lauren Paul; Rolf Drechsler.  EvoAl — Codeless Domain-Optimisation.  Genetic and Evolutionary Computation Conference (GECCO-2024). July 2024.

...

1) Bernhard J. Berger; Christina Plump; Lauren Paul; Rolf Drechsler.  EvoAl — Codeless Domain-Optimisation.  Genetic and Evolutionary Computation Conference (GECCO-2024). July 2024.
2) Christina Plump, Daniel C. Hoinkiss, Jörn Huber, Bernhard J. Berger, Matthias Günther, Christoph Lüth, Rolf Drechsler.  Finding the perfect MRI sequence for your patient --- Towards an optimisation workflow for MRI-sequences.   IEEE WCCI 2024. June 2024.
3) Milan Čugurović, Milena Vujošević Janičić, Vojin Jovanović, Thomas Würthinger.  GraalSP: Polyglot, efficient, and robust machine learning-based static profiler.   Journal of Systems and Software, Volume 213, 2024, 112058, ISSN 0164-1212. July. 2024.
4) Wenwen Feng, Xiaohui Lei, Yunzhong Jiang, Chao Wang, Weihong Liao, Hao Wang, Gong Xinghui, Yu Feng.  Coupling model predictive control and rules-based control for real-time control of urban river systems.   Journal of Hydrology, 2024, 131228, ISSN 0022-1694. April 2024.
5) S. Sint, A. Mazak-Huemer, M. Eisenberg, D. Waghubinger and M. Wimmer.  Automatic Optimization of Tolerance Ranges for Model-Driven Runtime State Identification.    IEEE Transactions on Automation Science and Engineering. April. 2024.
6) Cicirello, Vincent A.  Evolutionary Computation: Theories, Techniques, and Applications.    Applied Sciences 14, no. 6: 2542. Mar. 2024.
7) Koitz-Hristov R, Sterner T, Stracke L, Wotawa F.  On the suitability of checked coverage and genetic parameter tuning in test suite reduction.    J Softw Evol Proc. 2024;e2656. Feb. 2024.
8) Jordão, Rodolfo; Becker, Matthias; Sander, Ingo. IDeSyDe: Systematic Design Space Exploration via Design Space Identification.   ACM Transactions on Design Automation of Electronic Systems. Feb. 2024.
9) Squillero, G., Tonda, A. Veni, Vidi, Evolvi commentary on W. B. Langdon’s “Jaws 30”.   Genet Program Evolvable Mach 24, 24 (2023) Nov. 2023.
10) Eneko Osaba, Gorka Benguria, Jesus L. Lobo, Josu Diaz-de-Arcaya, Juncal Alonso, Iñaki Etxaniz. Optimizing IaC Configurations: a Case Study Using Nature-inspired Computing.   CIIS 2023.  Nov. 2023.
11) Sapra, D., Pimentel, A.D. Exploring Multi-core Systems with Lifetime Reliability and Power Consumption Trade-offs.   Embedded Computer Systems: Architectures, Modeling, and Simulation. SAMOS 2023. Lecture Notes in Computer Science, vol 14385. Springer, Cham. Nov. 2023.
12) Syed Juned Ali, Jan Michael Laranjo, Dominik Bork. A Generic and Customizable Genetic Algorithms-based Conceptual Model Modularization Framework.  27th International EDOC Conference (EDOC 2023) - Enterprise Design, Operations and Computing. Sep. 2023.
13) A. Elyasaf, E. Farchi, O. Margalit, G. Weiss and Y. Weiss. Generalized Coverage Criteria for Combinatorial Sequence Testing.  IEEE Transactions on Software Engineering, vol. 49, no. 08, pp. 4023-4034. Aug. 2023.
14) Julien Amblard, Robert Filman, Gabriel Kopito. GPStar4: A flexible framework for experimenting with genetic programming.  OGECCO '23 Companion: Proceedings of the Companion Conference on Genetic and Evolutionary Computation.  July 2023.
15) Garmendia, A., Bork, D., Eisenberg, M., Ferreira, T., Kessentini, M., Wimmer, M. Leveraging Artificial Intelligence for Model-based Software Analysis and Design.  Optimising the Software Development Process with Artificial Intelligence. Natural Computing Series. Springer, Singapore.  July 2023.
16) Sikora, M., Smołka, M. An Application of Evolutionary Algorithms and Machine Learning in Four-Part Harmonization.  Computational Science – ICCS 2023. ICCS 2023. Lecture Notes in Computer Science, vol 14073. Springer  June 2023.
17) Dolly Sapra and Andy D. Pimentel. Exploring Multi-core Systems with Lifetime Reliability and Power Consumption Trade-offs.  SAMOS '23.  May 2023.
18) Vipin Shukla, Mainak Bandyopadhyay. Optimization of input parameters of ANN–driven plasma source through nature-inspired evolutionary algorithms.  Intelligent Systems with Applications, Volume 18, 2023, 200200, ISSN 2667-3053.  May 2023.
19) P. Feichtenschlager, K. Schuetz, S. Jaburek, C. Schuetz, E. Gringinger. Privacy-Preserving Implementation of an Auction Mechanism for ATFM Slot Swapping.  Proceedings of the 23rd Integrated Communications, Navigation and Surveillance Conference (ICNS 2023), Washington D.C., U.S.A., April 18-20, 2023, IEEE Press, 12 pages.  April 2023.
20) Christoph Laaber, Tao Yue, Shaukat Ali. Multi-Objective Search-Based Software Microbenchmark Prioritization.  ArXiv/Computer Science/Software Engineering.  Nov. 2022.
21) Ricardo Ferreira Vilela, João Choma Neto, Victor Hugo Santiago Costa Pinto, Paulo Sérgio Lopes de Souza, Simone do Rocio Senger de Souza. Bio-inspired optimization to support the test data generation of concurrent software.  Concurrency and Computation: Practice and Experience.  Nov. 2022.
22) G. Mateeva, D. Parvanov, I. Dimitrov, I. Iliev and T. Balabanov. An Efficiency of Third Party Genetic Algorithms Software Libraries in Mobile Distributed Computing for Financial Time Series Forecasting.  2022 International Conference Automatics and Informatics (ICAI).  Oct. 2022.
23) Guilherme Espada, Leon Ingelse, Paulo Canelas, Pedro Barbosa, Alcides Fonseca. Data types as a more ergonomic frontend for Grammar-Guided Genetic Programming.  arXiv.  Oct. 2022.
24) Christoph G. Schuetz, Thomas Lorünser, Samuel Jaburek, Kevin Schuetz, Florian Wohner, Roman Karl & Eduard Gringinger. A Distributed Architecture for Privacy-Preserving Optimization Using Genetic Algorithms and Multi-party Computation.  CoopIS 2022: Cooperative Information Systems pp 168–185.  Sep. 2022.
25) Christina Plump, Bernhard J. Berger, Rolf Drechsler. Using density of training data to improve evolutionary algorithms with approximative fitness functions.  WCCI2022 IEEE WORLD CONGRESS ON COMPUTATIONAL INTELLIGENCE.  July 2022.
26) Christina Plump, Bernhard J. Berger, Rolf Drechsler. Adapting mutation and recombination operators to range-aware relations in real-world application data.  GECCO '22: Proceedings of the Genetic and Evolutionary Computation Conference Companion. Pages 755–758.  July 2022.
27) Eric Medvet, Giorgia Nadizar, Luca Manzoni. JGEA: a modular java framework for experimenting with evolutionary computation.  GECCO '22: Proceedings of the Genetic and Evolutionary Computation Conference Companion. Pages 2009–2018.  July 2022.
28) Moshe Sipper, Tomer Halperin, Itai Tzruia, Achiya Elyasaf. EC-KitY: Evolutionary Computation Tool Kit in Python with Seamless Machine Learning Integration. arXiv:2207.10367v1 [cs.NE].  July 2022.
29) A. Billedeaux and B. DeVries. Using Metamorphic Relationships and Genetic Algorithms to Test Open-Source Software.  2022 IEEE International Conference on Electro Information Technology (eIT), 2022, pp. 342-345.  July 2022.
30) R. Koitz-Hristov, L. Stracke and F. Wotawa. Checked Coverage for Test Suite Reduction – Is It Worth the Effort?   2022 IEEE/ACM International Conference on Automation of Software Test (AST), pp. 6-16.  June 2022.
31) Abdessamed Ouessai, Mohammed Salem, Antonio M. Mora. Evolving action pre-selection parameters for MCTS in real-time strategy games.   Entertainment Computing, Volume 42.  April 2022.
32) Musatafa Abbas Abbood Albadr, Sabrina Tiun, Masri Ayob, Fahad Taha AL-Dhief, Khairuddin Omar & Mhd Khaled Maen. Speech emotion recognition using optimized genetic algorithm-extreme learning machine.   Multimedia Tools and Applications,  March 2022.
33) Christina Plump, Bernhard Berger, Rolf Drechsler. Choosing the right technique for the right restriction - a domain-specific approach for enforcing search-space restrictions in evolutionary algorithms.   LDIC-2022, International Conference on Dynamics in Logistics,  Feb. 2022.
34) Quoc Nhat Han Tran, Nhan Quy Nguyen, Hicham Chehade, Lionel Amodeo, Farouk Yalaoui. Outpatient Appointment Optimization: A Case Study of a Chemotherapy Service.   Applied Sciences/Computing and Artificial Intelligence.  Jan. 2022.
35) Achiya Elyasaf, Eitan Farchi, Oded Margalit, Gera Weiss,  Yeshayahu Weiss. Combinatorial Sequence Testing Using Behavioral Programming and Generalized Coverage Criteria.   Journal of Systems and Software.  Jan. 2022.
36) Frequentis Group. D4.1 Report on State-ofthe-Art of Relevant Concepts.  SLOTMACHINE - RESULTS & PUBLIC DELIVERABLES, Frequentis
      Dec. 2021.
37) Huang Wanjie, Wang Haotian, Xue Yibo. Research on Optimization of in-warehouse picking Model based on genetic algorithm.  2021 International Conference on Information Technology, Education and Development (ICITED 2021).  Dec. 2021.
38) Aalam Z., Kaur S., Vats P., Kaur A., Saxena R. A Comprehensive Analysis of Testing Efforts Using the Avisar Testing Tool for Object Oriented Softwares.  Intelligent Sustainable Systems. Lecture Notes in Networks and Systems, vol 334. Springer, Singapore.  Dec. 2021.
39) Anh Vu Vo, Debra F. Laefer, Jonathan Byrne. Optimizing Urban LiDAR Flight Path Planning Using a Genetic Algorithm and a Dual Parallel Computing Framework. Remote Sensing, Volume 13, Issue 21.  Nov. 2021.
40) Pozas N., Durán F. On the Scalability of Compositions of Service-Oriented Applications.  ICSOC 2021: Service-Oriented Computing pp 449-463  Nov. 2021.
41) Küster, T., Rayling, P., Wiersig, R. et al. Multi-objective optimization of energy-efficient production schedules using genetic algorithms.  Optimization and Engineering (2021).  Oct. 2021.
42) B. DeVries and C. Trefftz. A Novelty Search and Metamorphic Testing Approach to Automatic Test Generation. 2021 IEEE/ACM 14th International Workshop on Search-Based Software Testing (SBST), 2021, pp. 8-11.  May 2021.
43) W. Geithner, Z. Andelkovic, O. Geithner, F. Herfurth, V. Rapp, A. Németh, F. Wilhelmstötter, A. H. Van Benschoten. ION SOURCE OPTIMIZATION USING BI-OBJECTIVE GENETIC AND MATRIX-PROFILE ALGORITHM. IPAC2021 - 12th International Particle Accelerator Conference.  May 2021.
44) C. Plump, B. J. Berger and R. Drechsler. Domain-driven Correlation-aware Recombination and Mutation Operators for Complex Real-world Applications.  2021 IEEE Congress on Evolutionary Computation (CEC), pp. 540-548.  July 2021.
45) Sapra, D., Pimentel, A.D. Designing convolutional neural networks with constrained evolutionary piecemeal training.  Appl Intell (2021).  July 2021.
46) Michela Lorandi, Leonardo Lucio Custode, Giovanni Iacca. Genetic improvement of routing in delay tolerant networks. GECCO '21: Proceedings of the Genetic and Evolutionary Computation Conference Companion.  July 2021, Pages 35–36.
47) Plump, Christina and Berger, Bernhard J. and Drechsler, Rolf. Improving evolutionary algorithms by enhancing an approximative fitness function through prediction intervals. IEEE Congress on Evolutionary Computation (IEEE CEC-2021).  June 2021.
48) Faltaous, Sarah, Abdulmaksoud, Aya, Kempe, Markus, Alt, Florian and Schneegass, Stefan. GeniePutt: Augmenting human motor skills through electrical muscle stimulation. it - Information Technology, vol. , no. , 2021.  May 2021.
49) Yiming Tang, Raffi Khatchadourian, Mehdi Bagherzadeh, Rhia Singh, Ajani Stewart, and Anita Raja. An Empirical Study of Refactorings and Technical Debt in Machine Learning Systems. In International Conference on Software Engineering, ICSE ’21.  May 2021.
50) Arifin H.H., Robert Ong H.K., Dai J., Daphne W., Chimplee N.  Model-Based Product Line Engineering with Genetic Algorithms for Automated Component Selection. In: Krob D., Li L., Yao J., Zhang H., Zhang X. (eds) Complex Systems Design & Management. Springer, Cham.  April 2021.
51) MICHELA LORANDI, LEONARDO LUCIO CUSTODE, and GIOVANNI IACCA. Genetic Improvement of Routing Protocols for DelayTolerant Networks.  arXiv:2103.07428v1  March 2021.
52) Amine Aziz-Alaoui, Carola Doerr, Johann Dreo. Towards Large Scale Automated Algorithm Designby Integrating Modular Benchmarking Frameworks.  E arXiv:2102.06435  Feb. 2021.
53) Dominik Bork and Antonio Garmendia and Manuel Wimmer. Towards a Multi-Objective Modularization Approach for Entity-Relationship Models. ER 2020, 39th International Conference on Conceptual Modeling.  Nov. 2020.
54) Sarfarazi, S.; Deissenroth-Uhrig, M.; Bertsch, V. Aggregation of Households in Community Energy Systems: An Analysis from Actors’ and Market Perspectives.  Energies 2020, 13, 5154.  Oct. 2020.
55) M. Šipek, D. Muharemagić, B. Mihaljević and A. Radovan. Enhancing Performance of Cloud-based Software Applications with GraalVM and Quarkus. 2020 43rd International Convention on Information, Communication and Electronic Technology (MIPRO), Opatija, Croatia, 2020, pp. 1746-1751.  Oct. 2020.
56) Vats P., Mandot M. A Comprehensive Analysis for Validation of AVISAR Object-Oriented Testing Tool. Joshi A., Khosravy M., Gupta N. (eds) Machine Learning for Predictive Analysis. Lecture Notes in Networks and Systems, vol 141. Springer, Singapore.  Oct. 2020.
57) Thakur, K., Kumar, G. Nature Inspired Techniques and Applications in Intrusion Detection Systems: Recent Progress and Updated Perspective. Archives of Computational Methods in Engineering (2020).  Aug. 2020.
58) Nur Hidayah Mat Yasin, Abdul Sahli Fakhrudin, Abdul Wafie Afnan Abdul Hadi, Muhammad Harith Mohd Khairuddin, Noor Raihana Abu Sepian, Farhan Mohd Said, Norazwina Zainol. Comparison of Response Surface Methodology and Artificial Neural Network for the Solvent Extraction of Fatty Acid Methyl Ester from Fish Waste.  International Journal of Modern Agriculture, Volume 9, No.3, 2020, ISSN: 2305-7246.  Sep. 2020.
59) Cicirello, V. A. Chips-n-Salsa: A Java Library of Customizable, Hybridizable, Iterative, Parallel, Stochastic, and Self-Adaptive Local Search Algorithms. Journal of Open Source Software, 5(52), 2448.  Aug. 2020.
60) Li, Yuanyuan; Carabelli, Stefano;Fadda, Edoardo; Manerba, Daniele; Tadei, Roberto; Terzo, Olivier. Machine Learning and Optimization for Production Rescheduling in Industry 4.0. THE INTERNATIONAL JOURNAL OF ADVANCED MANUFACTURING TECHNOLOGY. - ISSN 1433-3015.  Aug. 2020.
61) Dolly Sapra and Andy D. Pimentel. An Evolutionary Optimization Algorithm for GraduallySaturating Objective Functions. GECCO ’20, Cancún, Mexico.  July. 2020.
62) Dolly Sapra and Andy D. Pimentel. Constrained Evolutionary Piecemeal Training to Design Convolutional Neural Networks. IEA/AIE 2020 – Kitakyushu, Japan.  July. 2020.
63) Femi Emmanuel Ayo, Sakinat Oluwabukonla Folorunso, Adebayo A. Abayomi-Alli, Adebola Olayinka Adekunle, Joseph Bamidele   Awotunde. Network intrusion detection based on deep learning model optimized with rule-based hybrid feature selection. Information Security Journal: A Global Perspective.  May 2020.
64) Zainol N., Fakharudin A.S., Zulaidi N.I.S. Model Optimization Using Artificial Intelligence Algorithms for Biological Food Waste Degradation. Yaser A. (eds) Advances in Waste Processing Technology. Springer, Singapore.  May 2020.
65) Sonya Voneva, Manar Mazkatli, Johannes Grohmann and Anne Koziolek. Optimizing Parametric Dependencies forIncremental Performance Model Extraction. Karlsruhe Institute of Technology, Karlsruhe, Germany.  April. 2020.
66) Raúl Lara-Cabrera, Ángel González-Prieto, Fernando Ortega and Jesús Bobadilla. Evolving Matrix-Factorization-Based Collaborative Filtering Using Genetic Programming. MDPI, Applied Sciences.  Feb. 2020.
67) Humm B.G., Hutter M. Learning Patterns for Complex Event Detection in Robot Sensor Data. Optimization and Learning. OLA 2020. Communications in Computer and Information Science, vol 1173. Springer  Feb. 2020.
68) Erich C. Teppan, Giacomo Da Col. Genetic Algorithms for Creating Large Job Shop Dispatching Rules.  Advances in Integrations of Intelligent Methods. Smart Innovation, Systems and Technologies, vol 170. Springer, Singapore.  Jan. 2020.
69) Ricardo Pérez-Castillo, Francisco Ruiz, Mario Piattini. A decision-making support system for Enterprise Architecture Modelling.  Decision Support Systems.  Jan. 2020.
70) Sabrina Appel, Wolfgang Geithner, Stephan Reimann, Mariusz Sapinski, Rahul Singh and Dominik Vilsmeier. Application of nature-inspired optimization algorithms and machine learning for heavy-ion synchrotrons.  International Journal of Modern Physics A.  Dec. 2019.
71) O. M. Elzeki, M. F. Alrahmawy, Samir Elmougy. A New Hybrid Genetic and Information Gain Algorithm for Imputing Missing Values in Cancer Genes Datasets.  PInternational Journal of Intelligent Systems and Applications (IJISA), Vol.11, No.12, pp.20-33, DOI: 10.5815/ijisa.2019.12.03.  Dec. 2019.
72) Oliver Strauß, Ahmad Almheidat and Holger Kett. Applying Heuristic and Machine Learning Strategies to ProductResolution.  Proceedings of the 15th International Conference on Web Information Systems and Technologies (WEBIST 2019), pages 242-249.  Nov. 2019.
73) Yuanyuan Li, Stefano Carabelli, Edoardo Fadda, Daniele Manerba, Roberto Tadei1 and Olivier Terzo. Integration of Machine Learning and OptimizationTechniques for Flexible Job-Shop Rescheduling inIndustry 4.0.  Politecnico di Torino, Operations Research and Optimization Group.  Oct. 2019.
74) Höttger R., Igel B., Spinczyk O. Constrained Software Distribution for Automotive Systems.  Communications in Computer and Information Science, vol 1078.  Oct. 2019.
75) Jin-wooLee, Gwangseon Jang, Hohyun Jung, Jae-Gil Lee, Uichin Lee. Maximizing MapReduce job speed and reliability in the mobile cloud by optimizing task allocation.  Pervasive and Mobile Computing.  Oct. 2019.
76) Krawczyk, Lukas, Mahmoud Bazzal, Ram Prasath Govindarajan and Carsten Wolff. Model-Based Timing Analysis and Deployment Optimization for Heterogeneous Multi-core Systems using Eclipse APP4MC.  2019 ACM/IEEE 22nd International Conference on Model Driven Engineering Languages and Systems Companion: 44-53.  Sep. 2019.
77) Junio Cezar Ribeiro da Silva, Lorena Leão, Vinicius Petrucci, Abdoulaye Gamatié, Fernando MagnoQuintao Pereira. Scheduling in Heterogeneous Architectures via Multivariate Linear Regression on Function Inputs.  lirmm-02281112.  Sep. 2019.
78) Eric O. Scott, Sean Luke. ECJ at 20: toward a general metaheuristics toolkit.  GECCO '19: Proceedings of the Genetic and Evolutionary Computation Conference Companion, Pages 1391–1398.  July 2019.
79) Francisco G. Montoya and Raúl Baños Navarro (Eds.). Optimization Methods Applied to Power Systems, Volume 2.  MDPI Books, ISBN 978-3-03921-156-2.  July 2019.
80) Höttger, Robert & Ki, Junhyung & Bui, Bao & Igel, Burkhard & Spinczyk, Olaf. CPU-GPU Response Time and Mapping Analysis for High-Performance Automotive Systems.  10th International Workshop on Analysis Tools and Methodologies for Embedded and Real-time Systems (WATERS) co-located with the 31st Euromicro Conference on Real-Time Systems (ECRTS'19).  July 2019.
81) Maxime Cordy, Steve Muller, Mike Papadakis, and Yves Le Traon. Search-based test and improvement of machine-learning-based anomaly detection systems.  Proceedings of the 28th ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA 2019). ACM, New York, NY, USA, 158-168.  July 2019.
82) Michael Vistein, Jan Faber, Clemens Schmidt-Eisenlohr, Daniel Reiter. Automated Handling of Auxiliary Materials using a Multi-Kinematic Gripping System.  Procedia Manufacturing Volume 38, 2019, Pages 1276-1283.  June 2019.
83) Nikolaos Nikolakis, Ioannis Stathakis, Sotirios Makris. On an evolutionary information system for personalized support to plant operators.  52nd CIRP Conference on Manufacturing Systems (CMS), Ljubljana, Slovenia.  June 2019.
84) Michael Trotter, Timothy Wood and Jinho Hwang. Forecasting a Storm: Divining Optimal Configurations using Genetic Algorithms and Supervised Learning.  13th IEEE International Conference on Self-Adaptive and Self-Organizing Systems (SASO 2019).  June 2019.
85) Krawczyk, Lukas & Bazzal, Mahmoud & Prasath Govindarajan, Ram & Wolff, Carsten. An analytical approach for calculating end-to-end response times in autonomous driving applications.  10th International Workshop on Analysis Tools and Methodologies for Embedded and Real-time Systems (WATERS 2019).  June 2019.
86) Rodolfo Ayala Lopes, Thiago Macedo Gomes, and Alan Robert Resende de Freitas. A symbolic evolutionary algorithm software platform.  Proceedings of the Genetic and Evolutionary Computation Conference Companion (GECCO '19).  July 2019.
87) Aleksandar Prokopec, Andrea Rosà, David Leopoldseder, Gilles Duboscq, Petr Tůma, Martin Studener, Lubomír Bulej, Yudi Zheng, Alex Villazón, Doug Simon, Thomas Würthinger, Walter Binder. Renaissance: Benchmarking Suite for Parallel Applications on the JVM.  PLDI ’19, Phoenix, AZ, USA.  June 2019.
88) Robert Höttger, Lukas Krawczyk, Burkhard Igel, Olaf Spinczyk. Memory Mapping Analysis for Automotive Systems.  Brief Presentations Proceedings (RTAS 2019).  Apr. 2019.
89) Al Akkad, M. A., & Gazimzyanov, F. F. AUTOMATED SYSTEM FOR EVALUATING 2D-IMAGE COMPOSITIONAL CHARACTERISTICS: CONFIGURING THE MATHEMATICAL MODEL. Intellekt. Sist. Proizv., 17(1), 26-33. doi: 10.22213/2410-9304-2019-1-26-33.  Apr. 2019.
90) Alcayde, A.; Baños, R.; Arrabal-Campos, F.M.; Montoya, F.G. Optimization of the Contracted Electric Power by Means of Genetic Algorithms. Energies, Volume 12, Issue 7,  Apr. 2019.
91) Abdul Sahli Fakharudin, Norazwina Zainol, Zulsyazwan Ahmad Khushairi. Modelling and Optimisation of Oil Palm Trunk Core Biodelignification using Neural Network and Genetic Algorithm. IEEA '19: Proceedings of the 8th International Conference on Informatics, Environment, Energy and Applications; Pages 155–158,  Mar. 2019.
92) Aleksandar Prokopec, Andrea Rosà, David Leopoldseder, Gilles Duboscq, Petr Tůma, Martin Studener, Lubomír Bulej, Yudi Zheng, Alex Villazón, Doug Simon, Thomas Wuerthinger, Walter Binder. On Evaluating the Renaissance Benchmarking Suite: Variety, Performance, and Complexity. Cornell University: Programming Languages,  Mar. 2019.
93) S. Appel, W. Geithner, S. Reimann, M Sapinski, R. Singh, D. M. Vilsmeier OPTIMIZATION OF HEAVY-ION SYNCHROTRONS USINGNATURE-INSPIRED ALGORITHMS AND MACHINE LEARNING.13th Int. Computational Accelerator Physics Conf.,  Feb. 2019.
94) Saad, Christian, Bernhard Bauer, Ulrich R Mansmann, and Jian Li. AutoAnalyze in Systems Biology. Bioinformatics and Biology Insights,  Jan. 2019.
95) Gandeva Bayu Satrya, Soo Young Shin. Evolutionary Computing Approach to Optimize Superframe Scheduling on Industrial Wireless Sensor Networks. Cornell University,  Dec. 2018.
96) H.R. Maier, S. Razavi, Z. Kapelan, L.S. Matott, J. Kasprzyk, B.A. Tolson. Introductory overview: Optimization using evolutionary algorithms and other metaheuristics. Environmental Modelling & Software,  Dec. 2018.
97) Erich C. Teppan and Giacomo Da Col. Automatic Generation of Dispatching Rules for Large Job Shops by Means of Genetic Algorithms. CIMA 2018, International Workshop on Combinations of Intelligent Methods and Applications,  Nov. 2018.
98) Pasquale Salzaa, Filomena Ferrucci. Speed up genetic algorithms in the cloud using software containers. Future Generation Computer Systems,  Oct. 2018.
99) Ghulam Mubashar Hassan and Mark Reynolds. Genetic Algorithms for Scheduling and Optimization of Ore Train Networks. GCAI-2018. 4th Global Conference on Artificial Intelligence,  Sep. 2018.
100) Drezewski, Rafal & Kruk, Sylwia & Makowka, Maciej. [The Evolutionary Optimization of a Company’s Return on Equity Factor: Towards the Agent-Based Bio-Inspired System Supporting Corporate Finance Decisions.](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8466578) IEEE Access. 6. 10.1109/ACCESS.2018.2870201,  Sep. 2018.
101) Arifin, H. H., Chimplee, N. , Kit Robert Ong, H. , Daengdej, J. and Sortrakul, T. Automated Component‐Selection of Design Synthesis for Physical Architecture with Model‐Based Systems Engineering using Evolutionary Trade‐off. INCOSE International Symposium, 28: 1296-1310,  Aug. 2018.
102) Ong, Robert & Sortrakul, Thotsapon. Comparison of Selection Methods of Genetic Algorithms for Automated Component-Selection of Design Synthesis with Model-Based Systems Engineering. Conference: I-SEEC 2018,  May 2018.
103) Stephan Pirnbaum. [Die Evolution im Algorithmus - Teil 2: Multikriterielle Optimierung und Architekturerkennung.](http://www.buschmais.de/wp-content/uploads/2018/06/Die-Evolution-im-Algorithmus_Teil2_JS_03_18.pdf) JavaSPEKTRUM 03/2018, pp 66–69,  May 2018.
104) W. Geithner, Z. Andelkovic, S. Appel, O. Geithner, F. Herfurth, S. Reimann, G. Vorobjev, F. Wilhelmstötter. [Genetic Algorithms for Machine Optimization in the Fair Control System Environment.](http://accelconf.web.cern.ch/AccelConf/ipac2018/papers/thpml028.pdf) [The 9th International Particle Accelerator Conference (IPAC'18)](https://ipac18.org/welcome/),  May 2018.
105) Stephan Pirnbaum. [Die Evolution im Algorithmus - Teil 1: Grundlagen.](http://www.buschmais.de/wp-content/uploads/2018/02/Die-Evolution-im-Algorithmus_JS_01_18.pdf) JavaSPEKTRUM 01/2018, pp 64–68,  Jan. 2018.
106) Alexander Felfernig, Rouven Walter, José A. Galindo, David Benavides, Seda Polat Erdeniz, Müslüm Atas, Stefan Reiterer. Anytime diagnosis for reconfiguration.  Journal of Intelligent Information Systems, pp 1–22,  Jan. 2018.
107) Bruce A. Johnson. From Raw Data to Protein Backbone Chemical Shifts Using NMRFx Processing and NMRViewJ Analysis.  Protein NMR: Methods and Protocols, pp. 257--310, Springer New York,  Nov. 2017.
108) Cuadra P., Krawczyk L., Höttger R., Heisig P., Wolff C. Automated Scheduling for Tightly-Coupled Embedded Multi-core Systems Using Hybrid Genetic Algorithms.  Information and Software Technologies: 23rd International Conference, ICIST 2017, Druskininkai, Lithuania. Communications in Computer and Information Science, vol 756. Springer, Cham, Sep. 2017.
109) Michael Trotter, Guyue Liu, Timothy Wood. Into the Storm: Descrying Optimal Configurations Using Genetic Algorithms and Bayesian Optimization.  Foundations and Applications of Self* Systems (FAS*W), 2017 IEEE 2nd International Workshops Sep. 2017.
110) Emna Hachicha, Karn Yongsiriwit, Mohamed Sellami. Genetic-Based Configurable Cloud Resource Allocation in QoS-Aware Business Process Development.  Information and Software Technologies: 23rd International Conference, ICIST 2017, Druskininkai, Lithuania. Web Services (ICWS), 2017 IEEE International Conference, Jun. 2017.
111) Abraão G. Nazário, Fábio R. A. Silva, Raimundo Teive, Leonardo Villa, Antônio Flávio, João Zico, Eire Fragoso, Ederson F. Souza. Automação Domótica Simulada Utilizando Algoritmo Genético Especializado na Redução do Consumo de Energia.  Computer on the Beach 2017 pp. 180-189, March 2017.
112) Bandaru, S. and Deb, K. Metaheuristic Techniques. Decision Sciences. CRC Press, pp. 693-750, Nov. 2016.
113) Lyazid Toumi, Abdelouahab Moussaoui, and Ahmet Ugur. EMeD-Part: An Efficient Methodology for Horizontal Partitioning in Data Warehouses. Proceedings of the International Conference on Intelligent Information Processing, Security and Advanced Communication. Djallel Eddine Boubiche, Faouzi Hidoussi, and Homero Toral Cruz (Eds.). ACM, New York, NY, USA, Article 43, 7 pages, 2015.
114) Andreas Holzinger (Editor), Igo Jurisica (Editor). Interactive Knowledge Discovery and Data Mining in Biomedical Informatics. Lecture Notes in Computer Science, Vol. 8401. Springer, 2014.
115) Lyazid Toumi, Abdelouahab Moussaoui, Ahmet Ugur. Particle swarm optimization for bitmap join indexes selection problem in data warehouses. The Journal of Supercomputing, Volume 68, Issue 2, pp 672-708, May 2014.
116) TANG Yi (Guangzhou Power Supply Bureau Limited, Guangzhou 511400, China)  Study on Object-Oriented Reactive Compensation Allocation Optimization Algorithm for Distribution Networks, Oct. 2012.
117) John M. Linebarger, Richard J. Detry, Robert J. Glass, Walter E. Beyeler, Arlo L. Ames, Patrick D. Finley, S. Louise Maffitt.  Complex Adaptive Systems of Systems Engineering Environment Version 1.0.   SAND REPORT, Feb. 2012.

## Release notes

### [8.0.0](https://github.com/jenetics/jenetics/releases/tag/v8.0.0)

#### Improvements

* Java 21 is used for building and using the library.
* [#878](https://github.com/jenetics/jenetics/issues/878): Allow Virtual-Threads evaluating the fitness function. Must be enabled when creating an `Engine` (see code snippet below), the previous behaviour has been preserverd.
```java
final Engine<DoubleGene, Double> engine = Engine.builder(ff)
	.fitnessExecutor(BatchExecutor.ofVirtualThreads())
	.build();
```
* [#880](https://github.com/jenetics/jenetics/issues/880): Replace code examples in Javadoc with [JEP 413](https://openjdk.org/jeps/413).
* [#886](https://github.com/jenetics/jenetics/issues/886): Improve `CharStore` sort.
* [#894](https://github.com/jenetics/jenetics/issues/894): New genetic operators: `ShiftMutator`, `ShuffleMutator` and `UniformOrderBasedCrossover`.
* [#895](https://github.com/jenetics/jenetics/issues/895): Improve default `RandomGenerator` selection. The used `RandomGenerator` is selected in the following order:
	1) Check if the `io.jenetics.util.defaultRandomGenerator` start parameter is set. If so, take this generator.
	2) Check if the `L64X256MixRandom` generator is available. If so, take this generator.
	3) Find the _best_ available random generator according to the `RandomGeneratorFactory.stateBits()` value.
	4) Use the `Random` generator if no _best_ generator can be found. This generator is guaranteed to be available on every platform.

_[All Release Notes](RELEASE_NOTES.md)_

## License

The library is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).

	Copyright 2007-2024 Franz Wilhelmstötter

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.

## Used software


[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.pitest/pitest/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/org.pitest/pitest)
![Build Statis](https://github.com/hcoles/pitest/workflows/CI/badge.svg?branch=master)
[![Build Status](https://dev.azure.com/henrycoles/pitest/_apis/build/status/hcoles.pitest?branchName=master)](https://dev.azure.com/henrycoles/pitest/_build/latest?definitionId=3&branchName=master)

Pitest (aka PIT) is a state of the art mutation testing system for Java and the JVM.

Read all about it at https://pitest.org

## Releases

## 1.16.1

* #1329 Prevent version clashes with aggregate goal when plugins use jackson

## 1.16.0

* #1311 - Include unmodifiable collections stored directly to fields in the `+funmodifiablecollection` filter for defensive code
* #1319 - Use environment variables from surefire config
* #1322 - Automatically add -ea to enable assertions
* #1321 - Expand BuildVerifier interface

Api change in #1321 is backwards compatible, but plugins written against 1.16.0 may not work with earlier versions.

## 1.15.8

* #1310 Filter mutations to Collections.unmodifiable*
* #1309 Replace fields in argLines imported from surefire config
* #1308 Bump maven vcs versions

The filtering for #1310 is off by default. To activate it add the filter string `+funmodifiablecollection`.

1309 adds a new maven property `parseSurefireArgLine`. This is set to true by default, but surefire argline parsing can now be disabled by setting it to false.

## 1.15.7

#1305 Coverage not recorded for code in packages name com.sun*

A filter intended to pickup legacy JDK classes in the "com.sun.*" package was missing a `'`, resulting in no code coverage being registered if the code under test happened to be in a package starting with "sun".

## 1.15.6

* #1295  temporarily remove dynamic call tracking

Invoke dynamic call tracking for static initializer code will be reintroduced when additional logic to suppress mutation filtering for delayed execution code has been implemented.

## 1.15.5

* #1292 Arg lines taken from surefire config do not have properties replaced

## 1.15.4

* #1288 - New extension point to allow custom coverage export formats
* #1289 - Parse argline configuration from surefire configuration
* #1274 Follow invoke dynamic calls when detecting static initializer only methods

Note, maven users who have previously needed to duplicate argline parameters between surefire and pitest's `jvmArgs` and `argline` parameters may need
to adjust their configuration when upgrading. Entries supplied to surefire will now automatically be added to pitest.

## 1.15.3

* #1271 - Double check thread status before marking minion as dead

## 1.15.2

* #1268 - Filter Lombok NonNull checks
* #1267 - Expand test api to allow reporting of errors during test scanning

#1267 will ensure that previously hidden errors encountered by the JUnit5 plugin will now be reported. This is a backwards compatible api change. It will have no effect until the JUnit5 plugin is updated to use the expanded api. The updated plugin will not be compatible with earlier versions of pitest.

## 1.15.1

* #1260 Upgrade to ASM 9.6 for Java 22 support
* #1261 Do not error on pitest history files < 1.15.0

## 1.15.0

* #1253 suppress coverage stats when history test reduction enabled
* #1252 add extrafeatures param for maven to allow features to be added on commandline without overwriting existing list
* #1251 expand history interfaces (breaking change)
* #1250 improve error message when failing to parse feature strings
* #1248 performance tweak - delay test class identification
* #1247 legacy code removal

As a result of the breaking api changes in #1251, the arcmutate kotlin
plugin should be upgraded to 1.1.0 when upgrading to pitest 1.15.0

## 1.14.4

#1246 Priotitise previous killing test when using history files

## 1.14.3

* #1239 Support comma separated excludedGroups (thanks @johnathana)
* #1243 Explicitly order classpath in history file to ensure consistency between runs
* #1245 Prevent confusing logging of dummy incremental analysis runs

## 1.14.2

* #1221 - Unified percentage calculate (thanks @Vampire)
* #1218 - Thread safety for results collection when tests run in parallel (thanks @Vampire)
* #1225 - Prevent error when non archive files included on classpath
* #1229 - Mutate Iterables to emptyList
* #1227/1232 - Fix MethodMutator interface to depend on abstract types

## 1.14.1

* #1215 Apply coverage rewrites when aggregating reports
* #1219 Ensure try with resources filtering applied first (thanks @Vampire)

## 1.14.0

* #1213 Filter equivalent divide by -1 maths mutants
* #1212 Auto add junit-platform-launcher

#1212 Largely resolves the issue of keeping the pitest-junit5-plugin version in sync with the junit5 version for maven users.

When used with 1.2.0 of the pitest-junit5-plugin, pitest will now automatically select a version of junit-platform-launcher which
is compatible with the version of junit5 used by the system under test.

Issues remain for gradle users who may still encounter api compatibilities when using 1.2.0 of the pitest-junit5-plugin. These can however now
be resolved by manually adding the correct version of junit-platform-launcher to the classpath.

It is hoped that a future version of the pitest gradle plugin will implement a fix similar to the pitest-maven solution.

## 1.13.2

* #638  Ensure % shows as 100 when all mutants killed (thanks @Vampire)
* #1197 Show start up info when logging set to VERBOSE_NO_SPINNER (thanks @Vampire)
* #1198 Logging improvements (thanks @Vampire)
* #1200 Warn if parallel test execution enabled during coverage collection (thanks @Vampire)
* #1199 Switch to System.nanoTime for test timings (thanks @Vampire)
* #1207 Support for removal of class level annotations

## 1.13.1

* #1194 Support `**.` pattern in globs (thanks @Pfoerd)

## 1.13.0

* #1188 Allow mutators to produce multiple distinct mutations
* #1190 Provide test prioritiser to interceptors
* #1191 Enable mutation of annotations of methods and fields

## 1.12.0

* #1186 New extension points

## 1.11.7

* #1178 Commas in killing test name break csv export (thanks @Bonajo)
* #1177 Apply features in a consistent order
* #1176 Upgrade to ASM 9.5

## 1.11.6

* #1171 Prevent double instantiation of features
* #1170 Update links to https (thanks @romani)

## 1.11.5

* #1167 Fix poor static analysis performance for large methods
* #1166 Update pitest web link to https (thanks @romani)

## 1.11.4

* #1161 Prevent duplicate clinit when synthetic clinit present
* #1162 Auto add kotlin source dirs to maven when present

## 1.11.3

* #1159 Include only mutated classes in line coverage stats

## 1.11.2

* #1157 Report only target code lines

The line coverage stats reported on the console included code lines for the entire project, even when filters were applied. This
resulted in dramatically low coverage scores.

## 1.11.1

* #1156 Prevent synthetic lines being counted in coverage

## 1.11.0

* #1138 Do not mutate redundant fall through to default switch cases
* #1150 New extension points

Note that #1150 includes breaking interface changes which may require updates to third party plugins.

## 1.10.4

* #1134 Add `excludedRunners` parameter to command line interface and Ant
* #1131 Support surefire late property evaluation syntax for arglines

## 1.10.3

* #1128 Bug fix - lines with repeated debug entries double counted

## 1.10.2

* #1125 Bug fix - synthetic lambda methods not treated as code lines

## 1.10.1

* #1124 Fix bug introduced in 1.10.0 where bridge methods treated as valid lines of code

## 1.10.0

* #1067 Improved Quarkus and Roboelectric support
* #1116 Option to exclude lines 0 and 1 of all classes
* #1118 Detect missing plugins

As a result of #1067 it is important that mutations are only created for a single class for each JVM. The `MutationGrouper` extension point has therefore been removed as this allowed this constraint to be violated. Any third party plugins using this extension are no longer supported.

Releases also includes multiple changes to internal data structures. Any third party plugins relying on these structures may need to be updated.

1116 provides a coarse way to exclude auto-generated code not picked up by pitest's other filters. It is disabled by default as it may exclude code that is valid for mutation in some situations, but can be enabled by adding the feature string `+nofirstline`.

### 1.9.11

* #1105 Aggregator resolves wrong file for out of package kotlin files with same name
* #1111 Fix log typo (thanks @wangbo15)

### 1.9.10

* #1106 Do not replace Map.of with Collections.emptyMap
* #1109 Relax source file debug check

### 1.9.9

* #1098 Include case values in switch mutation descriptions

### 1.9.8

* #1094 Search for source files outside of package directories

Adds support for languages such as Kotlin where source files may not be within a directory structure which matches their package. Note that if the same filename occurs in more than one location, pitest cannot guarantee to resolve the correct file.

### 1.9.7

* #1091 - Escape class names in coverage XML

### 1.9.6

* #1092 - Upgrade to ASM 9.4
* #1091 - Properly escape coverage XML
* #1088 - Remove unused dependency distance param
* #1085 - Do not produce timestamp reports by default

Note that #1085 changes the default behaviour so reports are no longer written to timestamped directories by default. If you require this behaviour you will need to explicitly enable it.

### 1.9.5

* #1078 - Alter Config Updater interface
* #1079 - Avoid JBoss logging by default

1078 is a breaking interface change, but is included in a point release as it is believed there are
currently no external clients.

### 1.9.4

* #1063 - Improve filtering of equivalent return mutants
* #1064 - Remove legacy return val mutators and old defaults group
* #1066 - Expand static initializer filtering
* #1070 - Remove jacoco agent if present on argline

### 1.9.3

* #1052 - Support maven argLine property and single string argLines
* #1054 - Provide control over auto addition of -Djava.awt.headless=true
* #1055 - Option to autoset number of threads
* #1056 - Set timeout for socket communication
* #1058 - Set defaults for input and output encoding for programmatic api

1054 Moves support of auto adding headless=true (to prevent keyboard focus being stolen on Macs) into a feature.
It is enabled by default, but can be disabled by adding `-MACOS_FOCUS` to the features string.

1055 adds the option to guess the appropriate number of threads for the current machine by adding `+auto_threads`
the features string. This option is disabled by default and designed for local use. It is not recommended
for use on a CI server.

### 1.9.2

* #1050 - Check minions are alive to prevent process hangs

### 1.9.1

* #1047 Mitigation for intermittent process hangs

### 1.9.0

* #1035 - Improve coverage memory consumption
* #1038 - Support Maven Site Plugin 3.12.0+ (thanks IOs)
* #1040 - Faster JUnit 5 coverage calculation
* #1040 - Remove `dependencyDistance` parameter

As a result of #1040 any external pitest test plugins (eg JUnit 5, TestNG, arcmutate accelerator) must be
updated to a compatible version (1.0.0) when upgrading.

History files from earlier releases are incompatible and should be deleted when upgrading.

<details>
    <summary>Older versions</summary>

### 1.8.1

* #637  - Support different input and output encodings (thanks @qxo)
* #705  - Allow + in file paths (thanks @ali-ghanbari)
* #903  - Filter mutants in singleton constructors
* #1025 - Rework String Switch filtering
* #1027 - Rework assert filtering and remove legacy filter mechanism
* #1030 - Filter enum switch junk mutations

### 1.8.0

* #1017 - Improve static infinite loop detection
* #1020 - Rework NFA matching library and try with resource filtering
* #1022 - Support quarkus test

### 1.7.6

* #1008 Upgrade ASM for initial Java 19 support
* #1016 Fail cleanly when no working test plugin supplied
* #1015 Move TestNG support out of main codebase

As a result of #1015 the [TestNG plugin](https://github.com/pitest/pitest-testng-plugin) must now be configured when using pitest in codebases tested by TestNG. In earlier releases support was included automatically.

### 1.7.5

* #625 / #983 Fixed report aggregation (thanks @therealryan and @aurelien-baudet)
* #985 Handle empty surefire excludes
* #993 Move rv mutators to external plugin
* #994 / #995 Filter equivalent boxed return true mutants in try blocks
* #968 / 997 Improve filtering of equivalent empty return mutants
* #999 / 1003 New parameter to locate root of multi module projects

As a result of #993, anyone wishing to use the research orientated RV operators must configure the [pitest-rv plugin](https://github.com/pitest/pitest-rv-plugin), however these mutators are not recommended for general use.

### 1.7.4

* #965 - BigDecimal Mutator (thanks @MarcinNowak-codes)
* #750 - Support -DskipTests from command line (thanks @marwin1991)

### 1.7.3

* #952 Mutate map return to `emptyMap` instead of null
* #954 Allow mutators to be excluded
* #957 Filter equivalent mutations to Boolean.TRUE and Boolean.FALSE

### 1.7.2

* #943 Change default mutators - replace negate conditional with remove conditional
* #946 Mutate stream returns to empty stream instead of null

### 1.7.1

* #932 Improve switch mutation descriptions
* #934 Configure console output verbosity
* #940 Hide internal features
* #942 Fix for 3rd party mutation operators not added to client classpath
* #939 Improve caching of bytecode retrieval

### 1.7.0

* #923 Internal interface changes
* #930 Pluggable mutators

Due to internal changes some third party plugins maybe incompatible with this release.

All history files should be deleted before upgrading.

The names of the remove conditionals mutators have changed slightly as a result of #930 and
may need to be updated in build scripts if explicitly activated.

### 1.6.9

* #922 Filter equivalent stream.empty mutants in flatMap calls
* #921 Guarantee order of mutation operators
* #919 Filter junk mutations in java records

### 1.6.8

* #917 - Add method to retrieve all mutator ids for pitclipse and other tooling
* #913 - Bump ASM to 9.2

### 1.6.7

* #897 Fix description when replacing value with empty set
* #900 Support multiple test engines
* #822 Fix regression of NPE when reading classpath manifest
* #798 Fix regression of jvmArgs parameter support via maven
* #797 Fix regression of line coverage on console

As a result of #900 the `testPlugin` parameter is now defunct, but pitest will continue to accept it without error for this release. Pitest will use any test-engines supplied on the classpath, falling back to the built in JUnit4 support when other test engines cannot handle the class.

### 1.6.6

* #891 - Fix history performance
* #889 - Do not scan classpath for history when option not supplied
* #887 - Fix css for timeouts and memory errors
* #888 - Remove defunct max mutants per class perameter
* #890 - Remove defunct mutate static initalizers parameter

### 1.6.5

* #882 Avoid running tests when no mutants possible

### 1.6.4

* #862 Update ASM for Java 16

### 1.6.3

* #853 Fix case insensitive feature check
* #855 Make coverage data available to interceptors
* #857 Pass stderr/out data by line (thanks @kgeilmann)
* #858 Fix test not failing when maxSurviving is 0 (thanks @alexkoltz)
* #860 Fix junk mutations in try with resources in java 11+

### 1.6.2

* #770 and #746 Fix NPE during coverage stage (thanks @LaurentTho3)
* #849 Make feature names case insensitive
* #844 Extend feature system to work with listeners
* #842 Make report options available to listeners

### 1.6.1

* Automate release to maven central
* #774 Test strength statistic (thanks @alex859)
* #798 Enable jvm args to be passed from command line (thanks @yfrolov)
* #797 Add line coverage to console (thanks @qxo)
* #822 Mitigate NPE on accidental dependency (thanks @szpak)

### 1.5.2

* #749 ANT support for the fullMutationMatrix option (thanks @ayaankazerouni)
* #752, #755, #757 Version bumps and legacy code improvements (thanks @AlexElin)
* #758 Correctly can for test packages (thanks @nicerloop)
* #765 Fix incremental analysis for TestNG (thanks @StefanPenndorf)

### 1.5.1

* #737 Add skipFailingTests flag to command line tool (thanks @szpak)
* #739 Fix typo in error message (thanks @vmellgre)
* #745 Improve error message when junit not on classpath (thanks @szpak)
* #748 Bump asm to 8.0 for Java 14 support

### 1.5.0

* #556 - Do not mutate enum constructors
* #726 - Ensure static initializer coverage is recorded
* #734/#735/#736 - Replace legacy interfaces with Java API (thanks @AlexElin)

### 1.4.11

* #683 - Filter try-with-resources before filtering inlined code (thanks @Vampire)
* #686 - Do not print the class name twice for unsplittable test units (thanks @Vampire)
* #672 - Do not include the current directory to the minion class path (thanks @Vampire)
* #692 - Add property='skipPitest' to skip attribute inn maven plugin (thanks @cjgwhite)
* #697 - TestNG 7.0.0 compatibility (thanks @kris-scheibe)
* #666 - UOI4 reports mutated field name (thanks @LaurentTho3)
* #716 - Bump asm to 7.3.1 (required for Java 14)
* #710 - Use the new mutator set by default

### 1.4.10

* #534 Smaller blocks for more precise test targeting (thanks @jon-bell)
* #664 Fix A0D2 map key (thanks @Vampire)
* #656 Escape characters in init methods for html report (thanks @Vampire)
* #404 Filter junk mutations to compiler generated Objects.requireNonNull calls

### 1.4.9

* #613 / #623 - Fix for powermock issues on (thanks @jon-bell)
* #614 - Improved error message when no test plugin (thanks @szpak)
* #620 - Support annotation processors such as Micronaut that do not set debug filename

### 1.4.8

* #597 Fix for bug in coverage when large number of classes (thanks @jon-bell)
* #601 Avoid stealing keyboard focus on macos (thanks @maxgabut)

### 1.4.7

* #545 - Faster coverage calculation (thanks @jon-bell)

### 1.4.6

* #580 - upgrade to ASM 7.1
* #573 - Ant support for `testPlugin` and `failWhenNoMutations` (thanks @mduggan)
* #555 - Allow empty elements in maven configuration (thanks @maxgabut)

### 1.4.5

* #557 - Issues running on Java 8

### 1.4.4

* #518 - Experimental BigInteger mutator (thanks @ripdajacker)
* #513 - Sort mutators in html report (thanks @ThLeu)
* #553 - Classic mutators from literature (thanls @LaurentTho3)
* #528 - Added skipFailingTests option from maven plugin (thanks @nicerloop)

### 1.4.3

* #510 - Compute mutation test matrix (thanks @nrainer)
* #519 - Java 11 support

### 1.4.2

* #500 - Support for large classpaths with new `useClasspathJar` option (thanks @jqhan)

### 1.4.1

* #446 - Ignore empty directories when aggregating report (thanks @maxgabut)
* #457 - Fix base dir in multi module projects (thanks @sarahBuisson and @giggluigg)
* #471 - Basic Java 11 support
* #477 - Null byte in xml (thanks @maxgabut)
* #480 - Allow aggregation of timestamped reports (thanks @maxgabut)
* #495 - Move summary to end of console output (thanks @pedrorijo91)
* #499 - Fix for equivalent mutants in new return val mutators

### 1.4.0

* #445 - Raise minimum supported java version to 8
* Switch to ASM 6.1.1
* #448 Aggregate report based on module (thanks @sarahBuisson)
* #462 Escape test names in coverage xml (thanks @maxgabut)

### 1.3.2

* #433 - Aggregate reports via maven (thanks @rchargel)
* #438 - Filter tests at method level (thanks @ftrautsch)
* #439 - Primitives return mutator doesn't handle bytes
* #380 - Remove reliance on xstream for improved java 9 support
* #414 - Replace xstream history store (thanks @kiftio)

Note when upgrading that history files generated by previous releases are not compatible with 1.3.2 an above.

### 1.3.1

* #434 - XStream security warning

### 1.3.0

* #196 - Raise minimum java version to 7
* #425 - Broaden for-each detection
* #428 - Add `excludedTestClasses` parameter
* #379 - Remove support for mutating static initializers
* #432 - Add export plugin functionality into pitest
* #427 - Better return values mutators
* #429 - Simplify test api

428 changes the existing behaviour of the excludedClasses filter. Previously this excluded classes from both being mutated and run as tests which may require changes for some people when upgrading.

As a result of 429 TestNG tests will no longer be automatically detected - the new `testPlugin` parameter must be explicitly set to "testng".

### 1.2.5

* #407 - SCM goal cannot be run from within module (thanks @sbuisson)
* #256 - Inline style violate Content Security Policy (thanks @kiftio)
* #403 - No css in the html report viewed from jenkins (thanks @kiftio)
* #409 - Mutate based on changes across branched (thanks @sbuisson)
* #418 - Avoid for loop increments
* #424 - Avoid for each code
* #389 - Widen matching of implicit null checks

### 1.2.4

* #397 - Report reasons maven modules skipped
* #389 - Filter junk getClass null checks in lambdas
* #400 - Update to ASM 6.0

### 1.2.3

* Update to ASM 6 for Java 9 support
* #388 - Mark maven plugin as threadsafe
* #362 - Suppress common equivalent mutant in equals methods

### 1.2.2

* #367 - Static analysis cannot find core classes in some projects

### 1.2.1

* #347 - Avoid autogenerated code (e.g by lombok) anotated with @Generated
* #285 - Avoid compiler generated conditionals in switch on string. (thanks @Kwaq)
* #218 - New "naked receiver" / method chain mutator. (thanks @UrsMetz)
* #354/#356 - New extension point plus changes to reduce cost of random access to bytecode for static analysis
* #353 - Improved static initializer code detection
* #364 - Filter infinite loops via static analysis
* #365 - Configuration system for plugins

(Note #347 will **not** detect `javax.annotaion.Generated` as it has only source retention.)

### 1.2.0

* #318 - Separate main process code from code sharing client classpath
* #295 - Ignore abstract TestNG tests
* #215 - Automatic selection of target classes for maven
* #314 - Do not fail for maven modules without tests or code
* #306 - Do not fail when only interfaces are in changeset
* #325 - Anonymous class in Spock test causing error
* #334 - Compatibility with recent TestNG releases
* #335 - Incorrect coverage with powermock

Note - as of this release the maven plugin will automatically determine which classes to mutate instead of assuming that the package names match the group id.

### 1.1.11

* #269 - Not possible to break build on 1 mutant
* #271 - Include method descriptor in line coverage
* #170 - Exclusion by JUnit runner
* #291 - Handle empty excludes
* #287 - Check class hierarchy for annotations
* #289 - Option to supply classpath from file

### 1.1.10

* #260 - Initial support for mutating Kotlin code
* #264 - Support for yatspec runner (thanks @theangrydev)
* Break build when more than `maxSurviving` mutants survive

### 1.1.9

* #132 - Allow analysis of only files touched in last commit (thanks Tomasz Luch)

### 1.1.8

* #239 - Provide a shortcut to set history files via maven
* #240 - Support for regexes (thanks sebi-hgdata)
* #243 - Use ephemeral ports to communicate with minions

### 1.1.7

* #196 - Raise minimum java version to 1.6
* #231 - Process hangs

### 1.1.6

* #10  - Add maven report goal (thanks jasonmfehr)
* #184 - Remove undocumented project file feature
* #219 - Performance improvement for report generation (thanks tobiasbaum)
* #190 - Allow custom properties for plugins

Note this release contains a known issue (#231). Please upgrade.

### 1.1.5

* Fix for #148 - Stackoverflow with TestNG data providers when using JMockit
* Fix for #56 - Not reporting junit incompatibilities
* Fix for #174 - Invalid linecoverage.xml with static initializers
* Fix for #183 - Can't run GWTMockito tests
* Fix for #179 - Broken `includeLaunchClasspath=false` on Windows
* #173 - Read exclusions and groups from maven surefire config

### 1.1.4

* #157         - Support maven -DskipTests flag (thanks lkwg82)
* Fix for #163 - Should not include test tree in coverage threshold
* #166         - Allow classpath exclusions for maven plugin (thanks TomRK1089)
* #155         - Restore Java 5 compatibility
* Fix for #148 - Issue with JMockit + TestNG (thanks estekhin and KyleRogers)

### 1.1.3

* Fix for #158 - Tests incorrectly excluded from mutants
* Fix for #153 - SCM plugin broken for maven 2
* Fix for #152 - Does not work with IBM jdk

### 1.1.2

* Fix for #150 - line coverage under reported

### 1.1.1

* Block based coverage (fixes 79/131)
* End support for running on Java 5 (java 5 bytecode still supported)
* Skip flag for maven modules (#106)
* Stop declaring TestNG as a dependency
* New parameter propagation mutator (thanks UrsMetz)

### 1.1.0

* Change scheme for identifying mutants (see https://github.com/hcoles/pitest/issues/125)
* Support alternate test apis via plugin system
* Report error when supplied mutator name does not match (thanks artspb)
* Report exit codes from coverage child process (thanks KyleRogers)
* Treat JUnit tests with ClassRule annotation as one unit (thanks devmop)

Please note that any stored history files or sonar results are invalidated by this release.

### 1.0.0

* Switch version numbering scheme
* Upgrade to ASM 5.0.2
* Fix for #114 - fails to run for java 8 when -parameters flag is set
* #99 Support additionalClasspathElements property in maven plugin (thanks artspb)
* #98 Do not mutate java 7 try with resources (thanks @artspb)
* #109 extended remove conditional mutator (thanks @vrthra)

### 0.33

* Move to Github
* Upgrade of ASM to support Java 8 bytecode (thanks to "iirekm")
* Partial support for JUnit categories (thanks to "chrisr")
* New Remove Increments Mutator (thanks to Rahul Gopinath)
* Minor logging improvements (thanks to Kyle Rogers aka Stephan Penndorf)
* Fix for #92 - broken maven 2 support
* Fix for #75 - incorrectly ignored tests in classes with both @Ignore and @BeforeClass / @AfterClass

### 0.32

* restores java 7 compatibility
* new remove conditionals mutator
* support for mutating static initializers with TestNG
* properly isolate classpaths when running via Ant
* break builds on coverage threshold
* allow JVM to be specified
* support user defined test selection strategies
* support user defined output format
* support user defined test prioritisation
* fix for issue blocking usage with [Robolectric](http://robolectric.org/)

Note, setup for Ant based projects changes in this release. See [ant setup](https://pitest.org/quickstart/ant/) for details on usage.

### 0.31

* Maven 2 compatibility restored
* Much faster line coverage calculation
* Fix for #78 - Error when PowerMockito test stores mock as member

This release also changes a number of internal implementation details, some of which may be of interest/importance to those maintaining tools that
integrate with PIT.

Mutations are now scoped internally as described in [https://groups.google.com/forum/#!topic/pitusers/E0-3QZuMYjE](https://groups.google.com/forum/#!topic/pitusers/E0-3QZuMYjE)

A new class (org.pitest.mutationtest.tooling.EntryPoint) has been introduced that removes some of the duplication that existed in the various ways of launching mutation analysis.

### 0.30

* Support for parametrized [Spock](http://code.google.com/p/spock/) tests
* Support for [JUnitParams](http://code.google.com/p/junitparams/) tests
* Fix for #73 - JUnit parameterised tests calling mutee during setup failing during mutation phase
* Fix to #63 - ant task fails when empty options supplied
* Ability to override maven options from command line
* Ability to fail a build if it does not achieve a given mutation score
* Performance improvement when tests use @BeforeClass or @AfterClass annotations
* Slightly improved scheduling over multiple threads
* Improved maven multi project support
* Integration with source control for maven users

### 0.29

* Incremental analysis (--historyInputLocation and --historyOutputLocation)
* Inlined code detection turned on by default
* Quieter loggging by default
* Improved Java 7 support
* Upgrade of ASM from 3.3 to 4
* Fix for concurrency issues during coverage collection
* Fix for #53 - problems with snapshot junit versions
* Fix for #59 - duplicate dependencies set via maven

### 0.28

* Inlined finally block detection (--detectInlinedCode)
* New experimental switch statement mutator (contributed by Chris Rimmer)
* Do not mutate Groovy classes
* Fix for #33 - set user.dir to match surefire
* Fix for #43 - optionally suppress timestamped folders (--timestampedReports=true/false)
* Fix for #44 - concurrent modification exception when gathering coverage
* Fix for #46 - incorrect setting of flags by ant task
* Smaller memory footprint for main process
* Faster coverage gathering for large codebases
* Faster classpath scanning for large codebases
* Support for JUnit 3 suite methods
* Fixes for incorrect detection of JUnit 3 tests

**Known issue** - Fix for #33 may not resolve issue for maven 2 users.

Detection of Groovy code has not yet been tested with Groovy 2 which may generate substantially different
byte code to earlier versions.

### 0.27

* Much prettier reports
* Now avoids mutating assert statements
* Removed inScopeClasses option - use targetClasses and targetTests instead
* Fix for 100% CPU usage when child JVM crashes
* Fix for #35 #38 - experimental member variable mutator now corrects stack
* Fix for #39 - order of classpath elements now maintained when running from maven

**Upgrading users may need to modify their build due to removal of the inScopeClasses parameter**

### 0.26

* Ant support
* New experimental mutator for member variables
* Fix for #12 #27 - no longer hangs when code under test launches non daemon threads
* Fix for #26 - now warns when no test library found on classpath
* Fix for #30 - now errors if mutated classes have no line or source debug
* Fix for #32 - now correctly handles of JUnit assumptions

**Known issue** - The new member variable mutator may cause errors in synchronized errors. The mutator is
however disabled by default, and the generated errors are correctly handled by PIT.

### 0.25

* TestNG support (experimental)
* Fix for issue where mutations in nested classes not isolated from each other
* Fix for broken classpath isolation for projects using xstream
* Improved handling of JUnit parametrized tests
* Ability to limit mutations to specific classpath roots (--mutableCodePaths)
* Ability to add non launch classpath roots (--classPath) (experimental)
* Read configuration values from XML (experimental)
* Option to not throw error when no mutations found
* Consistent ordering of classes in HTML report
* Statistics written to console
* Classes no longer loaded during initial classpath scanning
* New syntax to easily enable all mutation operations

### 0.24

* JMockit support
* Option to output results in XML or CSV
* Fix for #11
* Improved INLINE_CONSTS mutator

### 0.23

* Fix for issue 7 - source files not located

### 0.22

* Upgrade of Xstream to 1.4.1 to enable OpenJDK 7 support
* Fix for #5 - corruption of newline character in child processes
* Ability to set child process launch arguments

### 0.21

* Significant performance improvements
* Support for powermock via both classloader (requires PowerMockIgnore annotation) and java agent
* Minor error reporting and usability improvements
* Fix for major defect around dependency analysis
* PIT dependencies no longer placed on classpath when running via maven
* Support for excluding certain classes or tests
* Support for verbose logging

### 0.20

* Limit number of mutations per class
* Upgrade xstream to 1.3.1
* Make available from maven central

### 0.19

* Built in enum methods now excluded from mutation
* Fixed bug around reporting of untested classes
* Support for excluding tests greater than a certain distance from class
* Support for excluding methods from mutation analysis
* Performance improvements
* Removed support for launching mutation reports from JUnit runner

### 0.18

* First public release
</details>

## Issues

Please consult our [issue management rules](ISSUES.md) before creating or working on issues.

## Credits

Pitest is mainly the work of [me](https://twitter.com/_pitest) but has benefited from contributions from many others.

Notable contributions not visible [here](https://github.com/hcoles/pitest/graphs/contributors) as they were made before this code was migrated to github include

* Nicolas Rusconi - Ant Task
* Struan Kerr-Liddell - Improvements to html report
* Stephan Pendorf - Multiple improvements including improved mutators

Although PIT does not incorporate any code from the Jumble project (http://jumble.sourceforge.net/), the Jumble codebase was used as a guide when developing some aspects of PIT.


[![Build status](https://builds.gbif.org/job/registry-dev/badge/icon)](https://builds.gbif.org/job/registry-dev/lastBuild/console)
[![Crowdin](https://badges.crowdin.net/gbif-registry/localized.svg)](https://crowdin.com/project/gbif-registry)

# GBIF Registry

The GBIF Registry is a core component of the architecture responsible for providing the authoritative source of information on GBIF participants (Nodes), institutions (e.g. data publishers), datasets, networks their interrelationships and the means to identify and access them.

As a distributed network, the registry serves a central coordination mechanism, used for example to allow publishers to declare their existence and for data integrating components to discover how to access published datasets and interoperate with the publisher.

## Contributing
* All changes must go to the **dev** branch for testing before merging to master.
* PR are preferred for complex functionality. **Please target the dev branch**.
* Simple changes can be committed without review.

## Code style

The registry uses the spotless-maven-plugin (import order, license header).
Please check the [motherpom](https://github.com/gbif/motherpom) project for some important configuration.

### Project files

Code style related files. **Please make sure you properly configure required IDE settings**:

- [gbif.importorder](./gbif.importorder) overrides default google package import order (for spotless-maven-plugin).
- [gbif-license-header](./gbif-license-header) provides default license header (for spotless-maven-plugin).
- [google-style.xml](./google-style.xml) java google code style, should be imported to IDE as a default one: Preferences → Editor → Code Style → Import scheme (gear next to 'Scheme' dropdown) → Intellij IDEA code style XML.
- [.editorconfig](./.editorconfig) formatting properties which overrides some inconvenient google ones (e.g. static imports at the beginning of imports list). Make sure editorconfig file is enabled in IDE: Preferences → Editor → Code Style → General → Enable EditorConfig support.

### Manual use of Spotless

Check the project follows code style conventions:

```
mvn spotless:check
```

Fix code style violations:

```
mvn spotless:apply
```

For more information see [documentation](https://github.com/diffplug/spotless/tree/master/plugin-maven).

## Modules
 Project modules:
 - [**registry-cli**](registry-cli/README.md)
 - [**registry-directory**](registry-directory/README.md)
 - [**registry-doi**](registry-doi/README.md)
 - [**registry-domain**](registry-domain/README.md)
 - [**registry-events**](registry-events/README.md)
 - [**registry-examples**](registry-examples/README.md)
 - [**registry-identity**](registry-identity/README.md)
 - [**registry-integration-tests**](registry-integration-tests/README.md)
 - [**registry-mail**](registry-mail/README.md)
 - [**registry-messaging**](registry-messaging/README.md)
 - [**registry-metasync**](registry-metasync/README.md)
 - [**registry-oaipmh**](registry-oaipmh/README.md)
 - [**registry-persistence**](registry-persistence/README.md)
 - [**registry-pipelines**](registry-pipelines/README.md)
 - [**registry-search**](registry-search/README.md)
 - [**registry-security**](registry-security/README.md)
 - [**registry-service**](registry-service/README.md)
 - [**registry-surety**](registry-surety/README.md)
 - [**registry-ws**](registry-ws/README.md)
 - [**registry-ws-client**](registry-ws-client/README.md)


# Docker plugin for Jenkins

Note: This plugin is officially ["up for adoption"](https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/#faq).
It would benefit from having a new maintainer who uses it "for real work"
and is thus able to test things "for real" before release
instead of relying purely on the unit tests.

## Overview

This plugin allows containers to be dynamically provisioned as Jenkins nodes using Docker.
It is a Jenkins Cloud plugin for Docker.

The aim of this docker plugin is to be able to use a
[Docker](https://docs.docker.com/)
host to dynamically provision a docker container as a Jenkins agent node,
let that run a single build,
then tear-down that node,
without the build process (or Jenkins job definition)
requiring any awareness of docker.

The Jenkins administrator configures Jenkins with
knowledge of one or more docker hosts (or swarms),
knowledge of one or more "templates"
(which describe
the labels/tags that this template provides,
the docker image,
how to start it,
etc)
and Jenkins can then run docker containers to provide Jenkins (agent) Nodes on which Jenkins can run builds.

## See also
* [Software licence](LICENSE)
* Support and [contribution guide](CONTRIBUTING.md)
* [Changelog](CHANGELOG.md)

----

**Note:** There is _more than one docker plugin_ for Jenkins.
While this can be confusing for end-users, it's even more confusing when end users report bugs in the wrong place.
e.g. if you are using Jenkins
[pipeline / workflow / Jenkinsfile](https://jenkins.io/doc/book/pipeline/docker/)
builds with code including terms like
`docker.withDockerRegistry`
or
`docker.image`
etc then you're using the
[`docker-workflow`](https://plugins.jenkins.io/docker-workflow)
plugin and should go to its repository instead of this one.

----

**Note:** This plugin does not use the OS's native docker client;
it uses [docker-java](https://github.com/docker-java/docker-java).
You do not need to install a docker client on Jenkins or on your agents to use this plugin.

----

**Note:** This plugin does not _provide_ a Docker daemon; it allows Jenkins to _use_ a docker daemon.
i.e. Once you've installed docker somewhere, this plugin will allow Jenkins to make use of it.

----

## Setup

A quick setup is :

1. get a docker environment running
1. follow the instructions for creating a docker image that can be used
as a Jenkins Agent
_or_ use one of the pre-built images
e.g. [jenkins/inbound-agent](https://hub.docker.com/r/jenkins/inbound-agent/)

### Docker Environment

Follow the installation steps on [the docker website](https://docs.docker.com/).

If your Jenkins instance is not on the same OS as the docker install,
you will need to open the docker TCP port so that Jenkins can communicate with the docker daemon.
This can be achieved by editing the docker config file and setting (for example)

```sh
DOCKER_OPTS="-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock"
```

The docker configuration file location will depend your system, but it
is likely to be
`/etc/init/docker.conf`
,
`/etc/default/docker`
or
`/etc/default/docker.io`.

### Multiple Docker Hosts

If you want to use more than just one physical node to run containers,
you can use
[Docker Swarm Standalone](https://github.com/docker/swarm)
or you can define more than one docker "cloud".
The docker engine swarm mode API is not supported
(at present; enhancement contributions would be welcomed).

To use the standalone swarm,
follow docker swarm standalone instructions and configure Jenkins with the swarm's API endpoint.

### Jenkins Configuration

Docker plugin is a "Cloud" implementation.
You'll need to edit Jenkins system configuration
(Jenkins -> Manage -> System configuration)
and add a new Cloud of type "Docker".

![](docs/images/add-new-docker-cloud.png)

Configure Docker (or Swarm standalone) API URL with required credentials.
The test button lets you check the connection.

Then configure Agent templates,
assigning them labels that you can use so your jobs select the appropriate template,
and set the docker container to be run with whatever container settings you require.

### Creating a docker image

You need a docker image that can be used to run Jenkins agent runtime.
Depending on the launch method you select, there's some prerequisites
for the Docker image to be used:

## Launch via SSH

-   [sshd](https://linux.die.net/man/8/sshd) server and a JDK installed.
    You can use
    [jenkins/ssh-agent](https://hub.docker.com/r/jenkins/ssh-agent/)
    as a basis for a custom image.
-   a SSH key (based on the unique Jenkins instance identity) can be
    injected in container on startup, you don't need any credential set
    as long as you use standard openssl sshd.
    ![](docs/images/connect-with-ssh.png)
    When using the `jenkins/ssh-agent` Docker image, ensure that the user
    is set to `jenkins`.
    For backward compatibility *or* non-standard sshd packaged in your
    docker image, you also have option to provide manually configured
    ssh credentials
-   **Note:** If the docker container's host SSH key is not trusted by
    Jenkins (usually the case) then you'll need to set the SSH host key
    verification method to "non-verifying".

## Launch via JNLP

-   a JDK installed.
    You can use
    [jenkins/inbound-agent](https://hub.docker.com/r/jenkins/inbound-agent/)
    as a basis for a custom image.
-   Jenkins controller URL has to be reachable from container.
-   container will be configured automatically with agent's name and
    secret, so you don't need any special configuration of the container.

## Launch attached

-   a JDK installed.
    You can use
    [jenkins/agent](https://hub.docker.com/r/jenkins/agent/)
    as a basis for a custom image.

To create a custom image and bundle your favorite tools,
create a `Dockerfile` with the `FROM` to point to one of the
jenkins/\*-agent
reference images,
and install everything needed for your own usage, e.g.

```
FROM jenkins/inbound-agent
RUN apt-get update && apt-get install XXX
COPY your-favorite-tool-here
```

## Note on ENTRYPOINT

Avoid overriding the docker command, as the SSH Launcher relies on it.

You _can_ use an Entrypoint to run some side service inside your build agent container before the agent runtime starts and establish a connection
... but you MUST ensure your entrypoint eventually runs the passed command:

    exec "$@"

## Further information

More information can be obtained from the online help built into the Jenkins web UI.
Most configurable fields have explanatory text.
This,
combined with knowledge of [docker itself](https://docs.docker.com/),
should answer most questions.

## Configuration as code

Jenkins and the docker-plugin can be configured using Groovy code
and/or using the [JCasC plugin](https://plugins.jenkins.io/configuration-as-code/).

If you're unsure which method to use, use JCasC.

### JCasC plugin

Install the [configuration-as-code plugin](https://plugins.jenkins.io/configuration-as-code/) and follow [its example](https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos/docker).

As another alternative, a Docker daemon can listen to requests from remote hosts by following the [Docker documentation](https://docs.docker.com/config/daemon/remote-access/).
The following configuration as code example creates a cloud named "my-docker-cloud" that uses the docker daemon at port 2375 on dockerhost.example.com to run up to 3 containerized agents at a time.
Agents run the [Jenkins Alpine inbound agent container image](https://hub.docker.com/r/jenkins/inbound-agent) with Java 21.
Thay use an inbound connection and run as the user ID 1000 with the home directory "/home/jenkins/agent".

```yaml
jenkins:
  clouds:
  - docker:
      containerCap: 3
      dockerApi:
        connectTimeout: 23
        dockerHost:
          uri: "tcp://dockerhost.example.com:2375"
        readTimeout: 43
      errorDuration: 313
      name: "my-docker-cloud"
      templates:
      - connector:
          jnlp:
            jenkinsUrl: "https://jenkins.example.com/"
            user: "1000"
        dockerTemplateBase:
          cpuPeriod: 0
          cpuQuota: 0
          image: "jenkins/inbound-agent:latest-alpine-jdk21"
        labelString: "alpine jdk21 alpine-jdk21 git-2.43"
        name: "alpine-jdk21"
        pullTimeout: 171
        remoteFs: "/home/jenkins/agent"
```

### Groovy script

For example, this
[configuration script](docs/attachments/docker-plugin-configuration-script.groovy)
could be run automatically upon
[Jenkins post-initialization](https://www.jenkins.io/doc/book/managing/groovy-hook-scripts/)
or through the
[Jenkins script console](https://www.jenkins.io/doc/book/managing/script-console/).
If run,
this script will configure the docker-plugin to look for a docker daemon running within the same OS as the Jenkins controller
(connecting to Docker service through `unix:///var/run/docker.sock`)
and with the containers connecting to Jenkins using the "attach" method.


# Redisson - Easy Redis Java client
and Real-Time Data Platform
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.redisson/redisson/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.redisson/redisson)
[![JavaDoc](http://www.javadoc.io/badge/org.redisson/redisson.svg)](http://www.javadoc.io/doc/org.redisson/redisson)
[![License](http://img.shields.io/:license-apache-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)

[Quick start](https://github.com/redisson/redisson#quick-start) | [Documentation](https://github.com/redisson/redisson/wiki/Table-of-Content) | [Changelog](https://github.com/redisson/redisson/blob/master/CHANGELOG.md) | [Code examples](https://github.com/redisson/redisson-examples) | [FAQs](https://github.com/redisson/redisson/wiki/16.-FAQ) | [Report an issue](https://github.com/redisson/redisson/issues/new)

Based on high-performance async and lock-free Java Redis client and [Netty](http://netty.io) framework.
Supported JDK:   1.8 - 21 and Android

## Features

* Thread-safe implementation
* [Redis](https://redis.io) 3.0 - 7.2 compatible
* [Valkey](https://valkey.io) 7.2.5+ compatible
* Supported deployment types
    * [Proxy](https://github.com/redisson/redisson/wiki/2.-Configuration/#29-proxy-mode)
    * [Multi-Cluster](https://github.com/redisson/redisson/wiki/2.-Configuration/#210-multi-cluster-mode)
    * [Multi-Sentinel](https://github.com/redisson/redisson/wiki/2.-Configuration/#211-multi-sentinel-mode)
    * [Single](https://github.com/redisson/redisson/wiki/2.-Configuration/#26-single-instance-mode)
    * [Cluster](https://github.com/redisson/redisson/wiki/2.-Configuration/#24-cluster-mode)
    * [Sentinel](https://github.com/redisson/redisson/wiki/2.-Configuration/#27-sentinel-mode)
    * [Replicated](https://github.com/redisson/redisson/wiki/2.-Configuration/#25-replicated-mode)
    * [Master and Slaves](https://github.com/redisson/redisson/wiki/2.-Configuration/#28-master-slave-mode)
* Amazon Web Services compatible
     * [AWS Elasticache Serverless](https://aws.amazon.com/elasticache/features/#Serverless)
     * [AWS Redis Global Datastore](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Redis-Global-Datastore.html)
     * [AWS ElastiCache](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html)
     * [Amazon MemoryDB](https://aws.amazon.com/memorydb)
* Microsoft Azure compatible
     * [Azure Redis Cache](https://azure.microsoft.com/en-us/services/cache/)
     * [Azure Redis Cache active-passive replication](https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-how-to-geo-replication)
     * [Azure Redis Cache active-active replication](https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-how-to-active-geo-replication)
* Google Cloud Memorystore compatible
     * [Google Cloud Redis](https://cloud.google.com/memorystore/docs/redis/)
     * [Google Cloud Redis High availability](https://cloud.google.com/memorystore/docs/redis/high-availability)
* Redis Enterprise compatible
     * [Redis Enterprise](https://redis.com/redis-enterprise/)
     * [Redis Enterprise Active-Active databases](https://docs.redis.com/latest/rs/databases/active-active/get-started/)
     * [Redis Enterprise Multiple Active Proxy](https://docs.redis.com/latest/rs/databases/configure/proxy-policy/#about-multiple-active-proxy-support)
* IBM Cloud compatible
     * [IBM Cloud Databases for Redis](https://www.ibm.com/cloud/databases-for-redis)
* Aiven compatible
     * [Aiven for Redis](https://aiven.io/redis)
* Supports auto-reconnection
* Supports failed to send command auto-retry
* Supports OSGi
* Supports SSL
* Asynchronous connection pool
* Lua scripting
* [RediSearch](https://github.com/redisson/redisson/wiki/9.-distributed-services/#96-redisearch-service)
* [JSON datatype](https://github.com/redisson/redisson/wiki/6.-distributed-objects/#615-json-object-holder)
* [Reactive Streams](https://github.com/redisson/redisson/wiki/3.-operations-execution#32-reactive-way) API
* [RxJava3](https://github.com/redisson/redisson/wiki/3.-operations-execution#32-reactive-way) API
* [Asynchronous](https://github.com/redisson/redisson/wiki/3.-operations-execution#31-async-way) API
* Local cache support including [Caffeine](https://github.com/ben-manes/caffeine)-based implementation
* [Distributed Java objects](https://github.com/redisson/redisson/wiki/6.-Distributed-objects)
    Object holder, Binary stream holder, Geospatial holder, BitSet, AtomicLong, AtomicDouble, PublishSubscribe,
    Bloom filter, HyperLogLog
* [Distributed Java collections](https://github.com/redisson/redisson/wiki/7.-Distributed-collections)
    Map, Multimap, Set, List, SortedSet, ScoredSortedSet, LexSortedSet, Queue, Deque, Blocking Queue, Bounded Blocking Queue, Blocking Deque, Delayed Queue, Priority Queue, Priority Deque
* [Distributed Java locks and synchronizers](https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers)
    Lock, FairLock, MultiLock, RedLock, ReadWriteLock, Semaphore, PermitExpirableSemaphore, CountDownLatch
* [Distributed services](https://github.com/redisson/redisson/wiki/9.-distributed-services)
    Remote service, Live Object service, Executor service, Scheduler service, MapReduce service
* [Helidon](https://github.com/redisson/redisson/tree/master/redisson-helidon) integration
* [Micronaut](https://github.com/redisson/redisson/tree/master/redisson-micronaut) integration
* [Quarkus](https://github.com/redisson/redisson/tree/master/redisson-quarkus) integration
* [Spring Cache](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks/#142-spring-cache) implementation
* [Spring Cloud Stream](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks/#149-spring-cloud-stream) implementation
* [Spring Transaction API](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks/#148-spring-transaction-manager) implementation
* [Spring Data Redis](https://github.com/redisson/redisson/tree/master/redisson-spring-data) implementation
* [Spring Boot Starter](https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter) implementation
* [Hibernate Cache](https://github.com/redisson/redisson/tree/master/redisson-hibernate) implementation
* [MyBatis Cache](https://github.com/redisson/redisson/tree/master/redisson-mybatis) implementation
* [Transactions API](https://github.com/redisson/redisson/wiki/10.-Additional-features#104-transactions)
* [JCache API (JSR-107)](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks/#144-jcache-api-jsr-107-implementation) implementation
* [Tomcat Session Manager](https://github.com/redisson/redisson/tree/master/redisson-tomcat) implementation
* [Spring Session](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks/#147-spring-session) implementation
* [Redis pipelining](https://github.com/redisson/redisson/wiki/10.-additional-features#103-execution-batches-of-commands) (command batches)
* Supports many popular codecs ([Kryo](https://github.com/EsotericSoftware/kryo), [Jackson JSON](https://github.com/FasterXML/jackson), [Avro](http://avro.apache.org/), [Smile](http://wiki.fasterxml.com/SmileFormatSpec), [CBOR](http://cbor.io/), [MsgPack](http://msgpack.org/), [Amazon Ion](https://amzn.github.io/ion-docs/), [LZ4](https://github.com/jpountz/lz4-java), [Snappy](https://github.com/xerial/snappy-java), [Protobuf](https://github.com/protocolbuffers/protobuf) and JDK Serialization)
* 2000+ unit tests

## Comparing solutions

### [Redisson vs Jedis](https://redisson.org/feature-comparison-redisson-vs-jedis.html)
### [Redisson vs Lettuce](https://redisson.org/feature-comparison-redisson-vs-lettuce.html)
### [Redis vs Apache Ignite](https://redisson.org/feature-comparison-redis-vs-ignite.html)
### [Redis vs Hazelcast](https://redisson.org/feature-comparison-redis-vs-hazelcast.html)
### [Redis vs Ehcache](https://redisson.org/feature-comparison-redis-vs-ehcache.html)

## Success stories

### [Moving from Hazelcast to Redis  /  Datorama](https://engineering.datorama.com/moving-from-hazelcast-to-redis-b90a0769d1cb)
### [Migrating from Hazelcast to Redis  /  Halodoc](https://blogs.halodoc.io/why-and-how-we-move-from-hazelcast-to-redis-2/)
### [Distributed Locking with Redis (Migration from Hazelcast)  /  ContaAzul](https://carlosbecker.com/posts/distributed-locks-redis/)
### [Migrating from Coherence to Redis](https://www.youtube.com/watch?v=JF5R2ucKTEg)

## Quick start

#### Maven
    <dependency>
       <groupId>org.redisson</groupId>
       <artifactId>redisson</artifactId>
       <version>3.31.0</version>
    </dependency>

#### Gradle
    compile 'org.redisson:redisson:3.31.0'

#### SBT
    libraryDependencies += "org.redisson" % "redisson" % "3.31.0"

#### Java

```java
// 1. Create config object
Config config = new Config();
config.useClusterServers()
       // use "rediss://" for SSL connection
      .addNodeAddress("redis://127.0.0.1:7181");

// or read config from file
config = Config.fromYAML(new File("config-file.yaml"));
```

```java
// 2. Create Redisson instance

// Sync and Async API
RedissonClient redisson = Redisson.create(config);

// Reactive API
RedissonReactiveClient redissonReactive = redisson.reactive();

// RxJava3 API
RedissonRxClient redissonRx = redisson.rxJava();
```

```java
// 3. Get Redis based implementation of java.util.concurrent.ConcurrentMap
RMap<MyKey, MyValue> map = redisson.getMap("myMap");

RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");

RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");
```

```java
// 4. Get Redis based implementation of java.util.concurrent.locks.Lock
RLock lock = redisson.getLock("myLock");

RLockReactive lockReactive = redissonReactive.getLock("myLock");

RLockRx lockRx = redissonRx.getLock("myLock");
```

```java
// 4. Get Redis based implementation of java.util.concurrent.ExecutorService
RExecutorService executor = redisson.getExecutorService("myExecutorService");

// over 50 Redis based Java objects and services ...

```

Upgrade to __[Redisson PRO](https://redisson.pro)__ with **advanced features**.

## Downloads

[Redisson 3.31.0](https://repo1.maven.org/maven2/org/redisson/redisson/3.31.0/redisson-3.31.0.jar),
[Redisson node 3.31.0](https://repo1.maven.org/maven2/org/redisson/redisson-all/3.31.0/redisson-all-3.31.0.jar)

## FAQs

[Q: What is the cause of RedisTimeoutException?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-what-is-the-cause-of-redistimeoutexception)

[Q: When do I need to shut down a Redisson instance, at the end of each request or the end of the life of a thread?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-when-do-i-need-to-shut-down-a-redisson-instance-at-the-end-of-each-request-or-the-end-of-the-life-of-a-thread)

[Q: In MapCache/SetCache/SpringCache/JCache, I have set an expiry time to an entry, why is it still in Redis when it should be disappeared?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-in-mapcachesetcachespringcachejcache-i-have-set-an-expiry-time-to-an-entry-why-is-it-still-in-redis-when-it-should-be-disappeared)

[Q: How can I perform Pipelining/Transaction through Redisson?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-how-can-i-perform-pipeliningtransaction-through-redisson)

[Q: Is Redisson thread safe? Can I share an instance of it between different threads?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-is-redisson-thread-safe-can-i-share-an-instance-of-it-between-different-threads)

[Q: Can I use different encoder/decoders for different tasks?](https://github.com/redisson/redisson/wiki/16.-FAQ#q-can-i-use-different-encoderdecoders-for-different-tasks)