ArithmeticSampler Derivatives

This commit is contained in:
Zoe Gidiere 2024-10-09 12:37:50 -06:00
parent fbe1c76e26
commit 1204b7a8c1
7 changed files with 75 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}