From 1204b7a8c129f3a989172f29e419a322f7b96a9e Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Wed, 9 Oct 2024 12:37:50 -0600 Subject: [PATCH] ArithmeticSampler Derivatives --- .../samplers/arithmetic/AdditionSampler.java | 10 ++++++++++ .../arithmetic/BinaryArithmeticSampler.java | 20 ++++++++++++++++++- .../samplers/arithmetic/DivisionSampler.java | 11 ++++++++++ .../noise/samplers/arithmetic/MaxSampler.java | 7 +++++++ .../noise/samplers/arithmetic/MinSampler.java | 7 +++++++ .../arithmetic/MultiplicationSampler.java | 11 ++++++++++ .../arithmetic/SubtractionSampler.java | 10 ++++++++++ 7 files changed, 75 insertions(+), 1 deletion(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java index c393d314d..f5574868a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/AdditionSampler.java @@ -12,4 +12,14 @@ public class AdditionSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return left + right; } + + @Override + public double[] operated(double[] left, double[] right) { + int dimensions = left.length; + double[] out = new double[dimensions]; + for(int i = 0; i < dimensions; i++) { + out[i] = left[i] + right[i]; + } + return out; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java index 03f3a3794..d9980404e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java @@ -1,9 +1,10 @@ package com.dfsek.terra.addons.noise.samplers.arithmetic; +import com.dfsek.terra.api.noise.DerivativeNoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler; -public abstract class BinaryArithmeticSampler implements NoiseSampler { +public abstract class BinaryArithmeticSampler implements DerivativeNoiseSampler { private final NoiseSampler left; private final NoiseSampler right; @@ -12,6 +13,11 @@ public abstract class BinaryArithmeticSampler implements NoiseSampler { this.right = right; } + @Override + public boolean isDifferentiable() { + return DerivativeNoiseSampler.isDifferentiable(left) && DerivativeNoiseSampler.isDifferentiable(right); + } + @Override public double noise(long seed, double x, double y) { return operate(left.noise(seed, x, y), right.noise(seed, x, y)); @@ -22,5 +28,17 @@ public abstract class BinaryArithmeticSampler implements NoiseSampler { return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z)); } + @Override + public double[] noised(long seed, double x, double y) { + return operated(((DerivativeNoiseSampler)left).noised(seed, x, y), ((DerivativeNoiseSampler)right).noised(seed, x, y)); + } + + @Override + public double[] noised(long seed, double x, double y, double z) { + return operated(((DerivativeNoiseSampler)left).noised(seed, x, y, z), ((DerivativeNoiseSampler)right).noised(seed, x, y, z)); + } + public abstract double operate(double left, double right); + + public abstract double[] operated(double[] left, double[] right); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java index 09169b613..aea17182a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/DivisionSampler.java @@ -12,4 +12,15 @@ public class DivisionSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return left / right; } + + @Override + public double[] operated(double[] left, double[] right) { + int dimensions = left.length; + double[] out = new double[dimensions]; + out[0] = left[0] / right[0]; + for(int i = 1; i < dimensions; i++) { + out[i] = (left[i] * right[0] - left[0] * right[i]) / (right[0] * right[0]); + } + return out; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java index e97722614..8c5bf03bd 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MaxSampler.java @@ -12,4 +12,11 @@ public class MaxSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return Math.max(left, right); } + + @Override + public double[] operated(double[] left, double[] right) { + double leftValue = left[0]; + double rightValue = right[0]; + return leftValue > rightValue ? left : right; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java index 7fcd42bdc..cbb8217c7 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MinSampler.java @@ -12,4 +12,11 @@ public class MinSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return Math.min(left, right); } + + @Override + public double[] operated(double[] left, double[] right) { + double leftValue = left[0]; + double rightValue = right[0]; + return leftValue < rightValue ? left : right; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java index d9fc46b7e..87ba08bf5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/MultiplicationSampler.java @@ -12,4 +12,15 @@ public class MultiplicationSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return left * right; } + + @Override + public double[] operated(double[] left, double[] right) { + int dimensions = left.length; + double[] out = new double[dimensions]; + out[0] = left[0] * right[0]; + for(int i = 1; i < dimensions; i++) { + out[i] = left[i] * right[0] + left[0] * right[i]; + } + return out; + } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java index 0b7f0b816..7ee7efad1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/SubtractionSampler.java @@ -12,4 +12,14 @@ public class SubtractionSampler extends BinaryArithmeticSampler { public double operate(double left, double right) { return left - right; } + + @Override + public double[] operated(double[] left, double[] right) { + int dimensions = left.length; + double[] out = new double[dimensions]; + for(int i = 0; i < dimensions; i++) { + out[i] = left[i] - right[i]; + } + return out; + } }