From c6cb88e4225ebe46e3920aea2c50d9263bdc1067 Mon Sep 17 00:00:00 2001 From: Claus Stadler Date: Fri, 8 Sep 2023 16:32:12 +0200 Subject: [PATCH] Added FixpointIterator to utils (function package) --- .../util/function/FixpointIteration.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/function/FixpointIteration.java diff --git a/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/function/FixpointIteration.java b/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/function/FixpointIteration.java new file mode 100644 index 00000000..4f4dc8e0 --- /dev/null +++ b/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/function/FixpointIteration.java @@ -0,0 +1,45 @@ +package org.aksw.commons.util.function; + +import java.util.Objects; +import java.util.function.Function; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FixpointIteration { + + private static Logger logger = LoggerFactory.getLogger(FixpointIteration.class); + + public static Function createClosure(Function transform) { + return op -> apply(op, transform); + } + + public static T apply(T op, Function transform) { + T current; + do { + current = op; + op = transform.apply(current); + } while(!current.equals(op)); + + return current; + } + + public static T apply(int max, T init, Function fn) { + T result = init; + + int i = 0; + for(; i < max; ++i) { + T tmp = fn.apply(result); + if(Objects.equals(tmp, result)) { + break; + } + result = tmp; + } + + if(i >= max) { + logger.warn("Fixpoint iteration reached iteration threshold"); + } + + return result; + } +}