From 5cf94f5d290732d64b83180f3d76b217d399605d Mon Sep 17 00:00:00 2001
From: Martin Larralde <martin.larralde@embl.de>
Date: Thu, 10 Aug 2023 11:49:32 +0200
Subject: [PATCH] Release v0.4.0

---
 CHANGELOG.md                         | 40 +++++++++++++++++++++++++++-
 lightmotif-bench/Cargo.toml          |  2 +-
 lightmotif-py/Cargo.toml             |  4 +--
 lightmotif-py/lightmotif/__init__.py |  2 +-
 lightmotif-tfmpvalue/Cargo.toml      |  4 +--
 lightmotif-transfac/Cargo.toml       |  4 +--
 lightmotif/Cargo.toml                |  2 +-
 7 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 108f86a..c0228d6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,45 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 
 ## [Unreleased]
-[Unreleased]: https://github.com/althonos/lightmotif/compare/v0.3.0...HEAD
+[Unreleased]: https://github.com/althonos/lightmotif/compare/v0.4.0...HEAD
+
+
+## [v0.4.0] - 2023-08-10
+[v0.4.0]: https://github.com/althonos/lightmotif/compare/v0.3.0...v0.4.0
+
+### Changed
+
+#### `lightmotif`
+- Improve `DenseMatrix::resize` performance when downsizing.
+- Explicitly panic when sequence is too long to be processed with `u32` indices in AVX2 and SSE2.
+- Reorganize `DenseMatrix` column alignment and index storage.
+- Improve `Score` performance by using pointers instead of slices in SIMD loops.
+- Rename `DenseMatrix::columns_effective` to `DenseMatrix::stride`.
+- Use streaming intrinsics to store data in AVX2 and SSE2 implementations.
+- Rename `BestPosition` trait to `Maximum`.
+
+#### `lightmotif-py`
+- Avoid error on missing symbols in `CountMatrix.__init__`
+
+### Added
+
+#### `lightmotif`
+- `Threshold` trait to find all position above a certain score in a `StripedScores` matrix.
+- `Encode` trait to encode an ASCII sequence into a `Vec<Symbol>`.
+- AVX2 implementation of `Score` using `gather` instead of `permute` for protein alphabets.
+- `From<Vec<_>>` and `Default` trait implementations to `EncodedSequence`.
+- `Alphabet` methods to operate on ASCII strings.
+- `StripedScores.is_empty` method to check if a `StripedScores` contains any score.
+
+#### `lightmotif-py`
+- `StripedScores.threshold` method wrapping the `Threshold` pipeline operation.
+- `StripedScores.max` and `StripedScores.argmax` methods to get the best score and best position.
+
+### Fixed
+
+#### `lightmotif`
+- `Score` causing an overflow when given a sequence shorter than the PSSM.
+- `Maximum` trait returns the smallest position on equal maxima.
 
 
 ## [v0.3.0] - 2023-06-25
diff --git a/lightmotif-bench/Cargo.toml b/lightmotif-bench/Cargo.toml
index 8454288..e720dd2 100644
--- a/lightmotif-bench/Cargo.toml
+++ b/lightmotif-bench/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightmotif-bench"
-version = "0.3.0"
+version = "0.4.0"
 edition = "2021"
 publish = false
 
diff --git a/lightmotif-py/Cargo.toml b/lightmotif-py/Cargo.toml
index a321471..d3a53a1 100644
--- a/lightmotif-py/Cargo.toml
+++ b/lightmotif-py/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightmotif-py"
-version = "0.3.0"
+version = "0.4.0"
 authors = ["Martin Larralde <martin.larralde@embl.de>"]
 edition = "2021"
 license = "MIT"
@@ -17,7 +17,7 @@ path = "lightmotif/lib.rs"
 
 [dependencies.lightmotif]
 path = "../lightmotif"
-version = "0.3.0"
+version = "0.4.0"
 [dependencies]
 pyo3 = "0.18.3"
 generic-array = "0.14"
diff --git a/lightmotif-py/lightmotif/__init__.py b/lightmotif-py/lightmotif/__init__.py
index 1181291..0ad0405 100644
--- a/lightmotif-py/lightmotif/__init__.py
+++ b/lightmotif-py/lightmotif/__init__.py
@@ -1,4 +1,4 @@
-__version__ = "0.3.0"
+__version__ = "0.4.0"
 
 from . import lib
 from .lib import (
diff --git a/lightmotif-tfmpvalue/Cargo.toml b/lightmotif-tfmpvalue/Cargo.toml
index 1217025..1286bf4 100644
--- a/lightmotif-tfmpvalue/Cargo.toml
+++ b/lightmotif-tfmpvalue/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightmotif-tfmpvalue"
-version = "0.3.0"
+version = "0.4.0"
 authors = ["Martin Larralde <martin.larralde@embl.de>"]
 edition = "2021"
 license = "GPL-3.0"
@@ -13,7 +13,7 @@ keywords = ["bioinformatics", "motif", "pssm", "pvalue"]
 
 [dependencies.lightmotif]
 path = "../lightmotif"
-version = "0.3.0"
+version = "0.4.0"
 [dependencies.fnv]
 version = "1.0"
 optional = true
diff --git a/lightmotif-transfac/Cargo.toml b/lightmotif-transfac/Cargo.toml
index d365b57..affbe61 100644
--- a/lightmotif-transfac/Cargo.toml
+++ b/lightmotif-transfac/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightmotif-transfac"
-version = "0.3.0"
+version = "0.4.0"
 authors = ["Martin Larralde <martin.larralde@embl.de>"]
 edition = "2021"
 license = "MIT"
@@ -13,7 +13,7 @@ keywords = ["bioinformatics", "motif", "parser", "transfac"]
 
 [dependencies.lightmotif]
 path = "../lightmotif"
-version = "0.3.0"
+version = "0.4.0"
 [dependencies]
 nom = "7"
 memchr = "2"
diff --git a/lightmotif/Cargo.toml b/lightmotif/Cargo.toml
index 42004dd..332594d 100644
--- a/lightmotif/Cargo.toml
+++ b/lightmotif/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "lightmotif"
-version = "0.3.0"
+version = "0.4.0"
 authors = ["Martin Larralde <martin.larralde@embl.de>"]
 edition = "2021"
 license = "MIT"
-- 
GitLab