From b971ca2020f213411de3038cc10ed6ba1701fc20 Mon Sep 17 00:00:00 2001 From: Samuel Abramov Date: Thu, 21 Dec 2023 23:13:36 +0100 Subject: [PATCH 1/2] feat(): Write an ImageLoader for png files --- .gitignore | 3 +- .../java/de/example/benchmark/Benchmark.java | 3 - .../de/example/mlp/MlpExampleOnMNIST.java | 22 +- .../edux/ml/mlp/core/network/BatchResult.java | 78 --- .../de/edux/ml/mlp/core/network/Engine.java | 16 +- .../ml/mlp/core/network/NeuralNetwork.java | 33 +- .../mlp/core/network/layers/DenseLayer.java | 4 +- .../core/network/loader/AbstractMetaData.java | 118 ++-- .../ml/mlp/core/network/loader/MetaData.java | 28 +- .../fractality/FractalityBatchData.java | 5 + .../loader/fractality/FractalityLoader.java | 176 +++++ .../loader/fractality/FractalityMetaData.java | 11 + .../network/loader/image/ImageBatchData.java | 6 - .../network/loader/image/ImageLoader.java | 180 ------ .../network/loader/image/ImageMetaData.java | 31 - .../network/loader/mnist/MnistBatchData.java | 5 + .../network/loader/mnist/MnistLoader.java | 173 +++++ .../network/loader/mnist/MnistMetaData.java | 30 + .../core/network/loader/test/TestLoader.java | 107 ++-- .../mlp/core/network/optimizer/Optimizer.java | 6 - .../ml/mlp/core/network/optimizer/SGD.java | 13 - .../ml/mlp/core/transformer/Transform.java | 5 - .../core/network/FractalityNetworkTest.java | 69 ++ .../edux/core/network/loader/LoaderTest.java | 55 +- .../de/edux/functions/InitializationTest.java | 36 -- .../fractality/FractalityLoaderTest.java | 49 ++ .../test/resources/fractality/test/images.csv | 121 ++++ .../resources/fractality/train/images.csv | 600 ++++++++++++++++++ 28 files changed, 1435 insertions(+), 548 deletions(-) delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/BatchResult.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityBatchData.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityMetaData.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageBatchData.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageLoader.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageMetaData.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistBatchData.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistLoader.java create mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistMetaData.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/Optimizer.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/SGD.java delete mode 100644 lib/src/main/java/de/edux/ml/mlp/core/transformer/Transform.java create mode 100644 lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java delete mode 100644 lib/src/test/java/de/edux/functions/InitializationTest.java create mode 100644 lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java create mode 100644 lib/src/test/resources/fractality/test/images.csv create mode 100644 lib/src/test/resources/fractality/train/images.csv diff --git a/.gitignore b/.gitignore index 7ef1e32..8ba3fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,5 @@ gradle.properties !**/src/main/**/gradle.properties /benchmark-data/augmentation-benchmark-images/* -*.png \ No newline at end of file +*.png +*.edux \ No newline at end of file diff --git a/example/src/main/java/de/example/benchmark/Benchmark.java b/example/src/main/java/de/example/benchmark/Benchmark.java index 3e682b2..3b5d2d9 100644 --- a/example/src/main/java/de/example/benchmark/Benchmark.java +++ b/example/src/main/java/de/example/benchmark/Benchmark.java @@ -3,9 +3,6 @@ import de.edux.api.Classifier; import de.edux.data.provider.DataProcessor; import de.edux.data.reader.CSVIDataReader; -import de.edux.functions.activation.ActivationFunction; -import de.edux.functions.initialization.Initialization; -import de.edux.functions.loss.LossFunction; import de.edux.ml.decisiontree.DecisionTree; import de.edux.ml.knn.KnnClassifier; import de.edux.ml.randomforest.RandomForest; diff --git a/example/src/main/java/de/example/mlp/MlpExampleOnMNIST.java b/example/src/main/java/de/example/mlp/MlpExampleOnMNIST.java index 4d7431f..27b4e8f 100644 --- a/example/src/main/java/de/example/mlp/MlpExampleOnMNIST.java +++ b/example/src/main/java/de/example/mlp/MlpExampleOnMNIST.java @@ -5,9 +5,9 @@ import de.edux.ml.mlp.core.network.layers.DenseLayer; import de.edux.ml.mlp.core.network.layers.ReLuLayer; import de.edux.ml.mlp.core.network.layers.SoftmaxLayer; -import de.edux.ml.mlp.core.network.loader.image.ImageLoader; import de.edux.ml.mlp.core.network.loader.Loader; import de.edux.ml.mlp.core.network.loader.MetaData; +import de.edux.ml.mlp.core.network.loader.mnist.MnistLoader; import java.io.File; public class MlpExampleOnMNIST { @@ -47,25 +47,27 @@ public static void main(String[] args) { int batchSize = 100; ExecutionMode singleThread = ExecutionMode.SINGLE_THREAD; - int epochs = 5; + int epochs = 100; float initialLearningRate = 0.1f; - float finalLearningRate = 0.001f; + float finalLearningRate = 0.0001f; - Loader trainLoader = new ImageLoader(trainImages, trainLabels, batchSize); - Loader testLoader = new ImageLoader(testImages, testLabels, batchSize); + Loader trainLoader = new MnistLoader(trainImages, trainLabels, batchSize); + Loader testLoader = new MnistLoader(testImages, testLabels, batchSize); MetaData trainMetaData = trainLoader.open(); int inputSize = trainMetaData.getInputSize(); - int outputSize = trainMetaData.getExpectedSize(); + int outputSize = trainMetaData.getNumberOfClasses(); trainLoader.close(); // Training from scratch new NetworkBuilder() - .addLayer(new DenseLayer(inputSize, 128)) + .addLayer(new DenseLayer(inputSize, 256)) .addLayer(new ReLuLayer()) - .addLayer(new DenseLayer(128, 128)) + .addLayer(new DenseLayer(256, 256)) .addLayer(new ReLuLayer()) - .addLayer(new DenseLayer(128, outputSize)) + .addLayer(new DenseLayer(256, 256)) + .addLayer(new ReLuLayer()) + .addLayer(new DenseLayer(256, outputSize)) .addLayer(new SoftmaxLayer()) .withBatchSize(batchSize) .withLearningRates(initialLearningRate, finalLearningRate) @@ -80,7 +82,7 @@ public static void main(String[] args) { new NetworkBuilder() .withExecutionMode(singleThread) .withEpochs(5) - .withLearningRates(0.01f, 0.001f) + .withLearningRates(0.001f, 0.001f) .loadModel("mnist_trained.edux") .fit(trainLoader, testLoader); } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/BatchResult.java b/lib/src/main/java/de/edux/ml/mlp/core/network/BatchResult.java deleted file mode 100644 index 26b931f..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/BatchResult.java +++ /dev/null @@ -1,78 +0,0 @@ -package de.edux.ml.mlp.core.network; - -import de.edux.ml.mlp.core.tensor.Matrix; - -import java.io.Serializable; -import java.util.LinkedList; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; - -public class BatchResult implements Serializable { - - private AtomicReference accumulatedWeightGradient = new AtomicReference<>(); - private AtomicReference accumulatedBiasGradient = new AtomicReference<>(); - private AtomicReference lastInput = new AtomicReference<>(); - - private AtomicReference learningRate = new AtomicReference<>(); - - private AtomicInteger counter = new AtomicInteger(0); - - private AtomicInteger length = new AtomicInteger(0); - - public BatchResult() { - counter.incrementAndGet(); - } - - public AtomicInteger getCounter() { - return counter; - } - - public synchronized void addGradients( - Matrix weightsGradient, Matrix biasGradient, float learningRate, Matrix lastInput) { - - this.length.incrementAndGet(); - - if (accumulatedWeightGradient.get() == null) { - accumulatedWeightGradient.set(weightsGradient); - } else { - accumulatedWeightGradient.set(accumulatedWeightGradient.get().add(weightsGradient)); - } - - if (accumulatedBiasGradient.get() == null) { - accumulatedBiasGradient.set(biasGradient); - } else { - accumulatedBiasGradient.set(accumulatedBiasGradient.get().add(biasGradient)); - } - - this.lastInput.set(lastInput); - this.learningRate.set(learningRate); - } - - public AtomicReference getAccumulatedWeightGradient() { - return accumulatedWeightGradient; - } - - public AtomicReference getAccumulatedBiasGradient() { - return accumulatedBiasGradient; - } - - public AtomicReference getLastInput() { - return lastInput; - } - - public AtomicReference getLearningRate() { - return learningRate; - } - - public void clear() { - accumulatedWeightGradient.set(null); - accumulatedBiasGradient.set(null); - lastInput.set(null); - learningRate.set(null); - length.set(0); - } - - public int getLength() { - return length.get(); - } -} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/Engine.java b/lib/src/main/java/de/edux/ml/mlp/core/network/Engine.java index f22d3d5..c743734 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/Engine.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/Engine.java @@ -1,10 +1,8 @@ package de.edux.ml.mlp.core.network; -import de.edux.api.Classifier; import de.edux.ml.mlp.core.network.loss.LossFunction; import de.edux.ml.mlp.core.network.loss.LossFunctions; import de.edux.ml.mlp.core.tensor.Matrix; -import de.edux.ml.mlp.core.transformer.Transform; import de.edux.ml.mlp.exceptions.UnsupportedLossFunction; import java.io.Serializable; import java.util.LinkedList; @@ -14,23 +12,19 @@ public class Engine implements Layer, Serializable { private static final long serialVersionUID = 1L; private final LinkedList lossHistory = new LinkedList<>(); private final LinkedList accuracyHistory = new LinkedList<>(); - private final LinkedList transforms = new LinkedList<>(); - private final LinkedList weights = new LinkedList<>(); - private final LinkedList biases = new LinkedList<>(); private final LinkedList layers = new LinkedList<>(); private final LossFunction lossFunction = LossFunction.CROSS_ENTROPY; private transient RunningAverages runningAverages; + private int batchSize; public Engine(int batchSize) { this.batchSize = batchSize; initAverageMetrics(); } - private int batchSize; - @Override public Matrix backwardLayerBased(Matrix error, float learningRate) { for (int i = layers.size() - 1; i >= 0; i--) { @@ -108,10 +102,6 @@ public LinkedList getAccuracyHistory() { return accuracyHistory; } - public void setBatchSize(int batchSize) { - this.batchSize = batchSize; - } - @Override public void updateWeightsAndBias() { for (Layer layer : layers) { @@ -122,4 +112,8 @@ public void updateWeightsAndBias() { public int getBatchSize() { return batchSize; } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java b/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java index 2197ba9..f45d14b 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java @@ -1,6 +1,5 @@ package de.edux.ml.mlp.core.network; -import de.edux.api.Classifier; import de.edux.ml.mlp.core.network.loader.BatchData; import de.edux.ml.mlp.core.network.loader.Loader; import de.edux.ml.mlp.core.network.loader.MetaData; @@ -27,6 +26,21 @@ public class NeuralNetwork implements Serializable { engine = new Engine(batchSize); } + public static NeuralNetwork loadModel(String fileName) { + NeuralNetwork model = null; + File file = new File(fileName); + if (!file.exists()) { + return null; + } + try (var ds = new ObjectInputStream(new FileInputStream(file))) { + model = (NeuralNetwork) ds.readObject(); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + log.info("Model loaded from {}", file.getAbsolutePath()); + return model; + } + public void setLearningRates(float initialLearningRate, float finalLearningRate) { this.initialLearningRate = initialLearningRate; this.finalLearningRate = finalLearningRate; @@ -64,7 +78,7 @@ private Matrix runBatch(Loader loader, boolean trainingMode) { BatchData batchData = loader.readBatch(); int itemsRead = metaData.getItemsRead(); int inputSize = metaData.getInputSize(); - int expectedSize = metaData.getExpectedSize(); + int expectedSize = metaData.getNumberOfClasses(); Matrix input = new Matrix(inputSize, itemsRead, batchData.getInputBatch()); Matrix expected = new Matrix(expectedSize, itemsRead, batchData.getExpectedBatch()); @@ -149,21 +163,6 @@ public boolean saveModel(String fileName) { return true; } - public static NeuralNetwork loadModel(String fileName) { - NeuralNetwork model = null; - File file = new File(fileName); - if (!file.exists()) { - return null; - } - try (var ds = new ObjectInputStream(new FileInputStream(file))) { - model = (NeuralNetwork) ds.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - log.info("Model loaded from {}", file.getAbsolutePath()); - return model; - } - public double[] predict(Matrix input) { return engine.forwardLayerbased(input).getData(); } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/layers/DenseLayer.java b/lib/src/main/java/de/edux/ml/mlp/core/network/layers/DenseLayer.java index ccefb33..1211dda 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/layers/DenseLayer.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/layers/DenseLayer.java @@ -6,9 +6,9 @@ import java.util.concurrent.atomic.AtomicReference; public class DenseLayer implements Layer { + private final Random random = new Random(); private AtomicReference weights; private AtomicReference bias; - private final Random random = new Random(); private Matrix lastInput; public DenseLayer(int inputSize, int outputSize) { @@ -60,6 +60,6 @@ public Matrix backwardLayerBased(Matrix error, float learningRate) { @Override public String toString() { - return "DenseLayer in: " + weights.get().getCols() + " x out: " + weights.get().getRows(); + return "Dense in: " + weights.get().getCols() + " x out: " + weights.get().getRows(); } } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/AbstractMetaData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/AbstractMetaData.java index a35cf85..b890900 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/AbstractMetaData.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/AbstractMetaData.java @@ -1,71 +1,81 @@ package de.edux.ml.mlp.core.network.loader; public abstract class AbstractMetaData implements MetaData { - private int numberItems; - private int inputSize; - private int expectedSize; - private int numberBatches; - private int totalItemsRead; - private int itemsRead; + private int numberItems; + private int inputSize; + private int numberOfClasses; + private int numberBatches; + private int totalItemsRead; + private int itemsRead; + private int batchLength; - @Override - public int getNumberItems() { - return numberItems; - } + @Override + public int getNumberItems() { + return numberItems; + } - @Override - public void setNumberItems(int numberItems) { - this.numberItems = numberItems; - } + @Override + public void setNumberItems(int numberItems) { + this.numberItems = numberItems; + } - @Override - public int getInputSize() { - return inputSize; - } + @Override + public int getInputSize() { + return inputSize; + } - @Override - public void setInputSize(int inputSize) { - this.inputSize = inputSize; + @Override + public void setInputSize(int inputSize) { + this.inputSize = inputSize; + } - } + @Override + public int getNumberOfClasses() { + return numberOfClasses; + } - @Override - public int getExpectedSize() { - return expectedSize; - } + @Override + public void setNumberOfClasses(int numberOfClasses) { + this.numberOfClasses = numberOfClasses; + } - @Override - public void setExpectedSize(int expectedSize) { - this.expectedSize = expectedSize; - } + @Override + public int getNumberBatches() { + return numberBatches; + } - @Override - public int getNumberBatches() { - return numberBatches; - } + @Override + public void setNumberBatches(int numberBatches) { + this.numberBatches = numberBatches; + } - @Override - public void setNumberBatches(int numberBatches) { - this.numberBatches = numberBatches; - } + @Override + public int getTotalItemsRead() { + return totalItemsRead; + } - @Override - public int getTotalItemsRead() { - return totalItemsRead; - } + @Override + public void setTotalItemsRead(int totalItemsRead) { + this.totalItemsRead = totalItemsRead; + } - @Override - public void setTotalItemsRead(int totalItemsRead) { - this.totalItemsRead = totalItemsRead; - } + @Override + public int getItemsRead() { + return itemsRead; + } - @Override - public int getItemsRead() { - return itemsRead; - } + @Override + public void setItemsRead(int itemsRead) { + this.itemsRead = itemsRead; + } - @Override - public void setItemsRead(int itemsRead) { - this.itemsRead = itemsRead; - } + @Override + public int getBatchLength() { + return batchLength; + } + + @Override + public void setBatchLength(int batchLength) { + this.batchLength = batchLength; + } } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/MetaData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/MetaData.java index 8bc202d..23b0cc7 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/MetaData.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/MetaData.java @@ -1,27 +1,31 @@ package de.edux.ml.mlp.core.network.loader; public interface MetaData { - int getNumberItems(); + int getNumberItems(); - void setNumberItems(int numberItems); + void setNumberItems(int numberItems); - int getInputSize(); + int getInputSize(); - void setInputSize(int inputSize); + void setInputSize(int inputSize); - int getExpectedSize(); + int getNumberOfClasses(); - void setExpectedSize(int expectedSize); + void setNumberOfClasses(int expectedSize); - int getNumberBatches(); + int getNumberBatches(); - void setNumberBatches(int numberBatches); + void setNumberBatches(int numberBatches); - int getTotalItemsRead(); + int getTotalItemsRead(); - void setTotalItemsRead(int totalItemsRead); + void setTotalItemsRead(int totalItemsRead); - int getItemsRead(); + int getItemsRead(); - void setItemsRead(int itemsRead); + void setItemsRead(int itemsRead); + + int getBatchLength(); + + void setBatchLength(int batchLength); } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityBatchData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityBatchData.java new file mode 100644 index 0000000..1fade60 --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityBatchData.java @@ -0,0 +1,5 @@ +package de.edux.ml.mlp.core.network.loader.fractality; + +import de.edux.ml.mlp.core.network.loader.AbstractBatchData; + +public class FractalityBatchData extends AbstractBatchData {} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java new file mode 100644 index 0000000..0735da7 --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java @@ -0,0 +1,176 @@ +package de.edux.ml.mlp.core.network.loader.fractality; + +import de.edux.ml.mlp.core.network.loader.BatchData; +import de.edux.ml.mlp.core.network.loader.Loader; +import de.edux.ml.mlp.core.network.loader.MetaData; +import de.edux.ml.mlp.core.network.loader.mnist.MnistMetaData; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.stream.Stream; +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageInputStream; + +public class FractalityLoader implements Loader { + + private final String imageFolderPath; + private final String csvLabelDataFile; + private final int batchLength; + private final Map csvContent; + private final int imageWidth; + private final int imageHeight; + Iterator> csvContentIterator; + private ImageInputStream imageInputStream; + private MnistMetaData metaData; + + public FractalityLoader( + String imageFolderPath, String csvLabelDataFile, int batchLength, int width, int height) { + this.imageWidth = width; + this.imageHeight = height; + this.imageFolderPath = imageFolderPath; + this.csvLabelDataFile = csvLabelDataFile; + this.batchLength = batchLength; + + csvContent = getCsvContent(csvLabelDataFile); + csvContentIterator = csvContent.entrySet().iterator(); + } + + private Map getCsvContent(String csvLabelDataFile) { + Map csvContent = new HashMap<>(); + + try (Stream stream = Files.lines(Paths.get(csvLabelDataFile))) { + stream + .skip(1) + .forEach( + line -> { + String[] parts = line.split(","); + if (parts.length >= 2) { + csvContent.put(parts[0], parts[1]); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + + return csvContent; + } + + @Override + public MetaData open() { + return readMetaData(); + } + + private MetaData readMetaData() { + this.metaData = new MnistMetaData(); + metaData.setNumberItems(csvContent.size()); + metaData.setInputSize(imageWidth * imageHeight); + metaData.setNumberOfClasses(6); + metaData.setNumberBatches((int) Math.ceil(metaData.getNumberItems() / batchLength)); + metaData.setHeight(imageHeight); + metaData.setWidth(imageWidth); + metaData.setBatchLength(batchLength); + + return metaData; + } + + + + @Override + public void close() { + + this.metaData = null; + } + + @Override + public MetaData getMetaData() { + return metaData; + } + + @Override + public BatchData readBatch() { + BatchData batchData = new FractalityBatchData(); + var totalItemsRead = metaData.getTotalItemsRead(); + var numberItems = metaData.getNumberItems(); + + int inputsRead = readInputBatch(batchData); + + return batchData; + } + + private int readInputBatch(BatchData batchData) { + var numberToRead = + Math.min(metaData.getBatchLength(), metaData.getInputSize()) - metaData.getTotalItemsRead(); + double[] dataInputs = new double[metaData.getInputSize() * metaData.getBatchLength()]; + double[] dataExpected = new double[metaData.getNumberOfClasses() * metaData.getBatchLength()]; + + for (int i = 0; i < numberToRead; i++) { + if (csvContentIterator.hasNext()) { + Map.Entry entry = csvContentIterator.next(); + String imagePath = + imageFolderPath + + File.separator + + entry.getValue() + + File.separator + + entry.getKey() + + ".png"; + System.out.println(imagePath); + + try { + BufferedImage image = ImageIO.read(new File(imagePath)); + + int indexInputs = 0; + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + Color color = new Color(image.getRGB(x, y)); + dataInputs[indexInputs++] = colorToDouble(color); + } + } + batchData.setInputBatch(dataInputs); + + int indexExpected = 0; + dataExpected[indexExpected++] = fractalityToDouble(entry.getValue()); + batchData.setExpectedBatch(dataExpected); + } catch (IOException e) { + e.printStackTrace(); + return 0; + } + } + } + return dataInputs.length / metaData.getInputSize(); + } + + private double fractalityToDouble(String value) { + switch (value) { + case "mandelbrot": + return 1d; + case "sierpinski_gasket": + return 2d; + case "julia": + return 3d; + case "burningship": + return 4d; + case "tricorn": + return 5d; + case "newton": + return 6d; + default: + return -1; + } + } + + private double colorToDouble(Color color) { + // Konvertierung zu Graustufen und Normalisierung (Beispiel) + return (color.getRed() + color.getGreen() + color.getBlue()) / 3.0 / 255.0; + } + + public Map getCsvContent() { + return csvContent; + } +} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityMetaData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityMetaData.java new file mode 100644 index 0000000..b64d2a6 --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityMetaData.java @@ -0,0 +1,11 @@ +package de.edux.ml.mlp.core.network.loader.fractality; + +import de.edux.ml.mlp.core.network.loader.AbstractMetaData; + +public class FractalityMetaData extends AbstractMetaData { + @Override + public void setItemsRead(int itemsRead) { + super.setItemsRead(itemsRead); + super.setTotalItemsRead(super.getTotalItemsRead() + itemsRead); + } +} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageBatchData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageBatchData.java deleted file mode 100644 index 9b50c93..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageBatchData.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.edux.ml.mlp.core.network.loader.image; - -import de.edux.ml.mlp.core.network.loader.AbstractBatchData; - -public class ImageBatchData extends AbstractBatchData { -} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageLoader.java deleted file mode 100644 index 557c8fd..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageLoader.java +++ /dev/null @@ -1,180 +0,0 @@ -package de.edux.ml.mlp.core.network.loader.image; - -import de.edux.ml.mlp.core.network.loader.BatchData; -import de.edux.ml.mlp.core.network.loader.Loader; -import de.edux.ml.mlp.core.network.loader.MetaData; -import de.edux.ml.mlp.core.network.loader.image.ImageBatchData; -import de.edux.ml.mlp.core.network.loader.image.ImageMetaData; -import de.edux.ml.mlp.exceptions.LoaderException; -import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class ImageLoader implements Loader { - private String imageFileName; - private String labelFileName; - private int batchSize; - private DataInputStream imageInputStream; - private DataInputStream labelInputStream; - private ImageMetaData metaData; - private Lock readLock = new ReentrantLock(); - - public ImageLoader(String imageFileName, String labelFileName, int batchSize) { - this.imageFileName = imageFileName; - this.labelFileName = labelFileName; - this.batchSize = batchSize; - } - - - @Override - public MetaData open() { - imageInputStream = getImageInputStream(imageFileName); - labelInputStream = getImageInputStream(labelFileName); - return readMetaData(); - } - - private DataInputStream getImageInputStream(String filename) { - try { - return new DataInputStream(new FileInputStream(filename)); - } catch (Exception e) { - e.printStackTrace(); - throw new LoaderException(" Error opening file " + filename); - } - } - - @Override - public void close() { - metaData = null; - try { - imageInputStream.close(); - labelInputStream.close(); - - } catch (IOException e) { - throw new LoaderException("Error closing file " + imageFileName); - } - - } - - @Override - public MetaData getMetaData() { - return metaData; - } - - @Override - public BatchData readBatch() { - readLock.lock(); - ImageBatchData batchData; - try { - batchData = new ImageBatchData(); - int inputItemsRead = readInputBatch(batchData); - int expectedItemsRead = readExpectedBatch(batchData); - - if (inputItemsRead != expectedItemsRead) { - throw new LoaderException("Number of input items read does not match number of expected items read"); - } - metaData.setItemsRead(inputItemsRead); - } finally { - readLock.unlock(); - } - return batchData; - } - - private int readExpectedBatch(ImageBatchData batchData) { - try { - var totalItemsRead = metaData.getTotalItemsRead(); - var numberItems = metaData.getNumberItems(); - var numberToRead = Math.min(batchSize, numberItems - totalItemsRead); - - var labelData = new byte[numberToRead]; - var expectedSize = metaData.getExpectedSize(); - var numberRead = labelInputStream.read(labelData, 0, numberToRead); - - if (numberRead != numberToRead) { - throw new LoaderException("Error reading expected data from file " + labelFileName); - } - - double[] data = new double[numberToRead * expectedSize]; - for (int i = 0; i < numberToRead; i++) { - byte label = labelData[i]; - data[i * expectedSize + label] = 1.0; - } - batchData.setExpectedBatch(data); - return numberToRead; - } catch (IOException e) { - throw new LoaderException("Error reading input data from file " + imageFileName); - } - } - - private int readInputBatch(ImageBatchData batchData) { - var totalItemsRead = metaData.getTotalItemsRead(); - var numberItems = metaData.getNumberItems(); - var numberToRead = Math.min(batchSize, numberItems - totalItemsRead); - - - var inputSize = metaData.getInputSize(); - var numberBytesToRead = numberToRead * inputSize; - - byte[] imageData = new byte[numberBytesToRead]; - - try { - var numberRead = imageInputStream.read(imageData, 0, numberBytesToRead); - if (numberRead != numberBytesToRead) { - throw new LoaderException("Error reading input data from file " + imageFileName); - } - double[] data = new double[numberBytesToRead]; - - for (int i = 0; i < numberBytesToRead; i++) { - data[i] = (imageData[i] & 0xFF) / 256.0; - } - batchData.setInputBatch(data); - return numberToRead; - } catch (IOException e) { - throw new LoaderException("Error reading input data from file " + imageFileName); - } - } - - - private MetaData readMetaData() { - int numberItems = 0; - metaData = new ImageMetaData(); - try { - int magicNumber = labelInputStream.readInt(); - if (magicNumber != 2049) { - throw new LoaderException("Invalid magic number in file " + labelFileName); - } - - numberItems = labelInputStream.readInt(); - metaData.setNumberItems(numberItems); - - - } catch (IOException e) { - throw new LoaderException("Error reading magic number from file " + labelFileName); - } - - try { - int magicNumber = imageInputStream.readInt(); - if (magicNumber != 2051) { - throw new LoaderException("Invalid magic number in file " + labelFileName); - } - - if (numberItems != imageInputStream.readInt()) { - throw new LoaderException("Number of labels and images do not match"); - } - - int height = imageInputStream.readInt(); - int width = imageInputStream.readInt(); - metaData.setInputSize(height * width); - metaData.setExpectedSize(10); - metaData.setNumberBatches((int) Math.ceil(numberItems / batchSize)); - metaData.setHeight(height); - metaData.setWidth(width); - - } catch (IOException e) { - throw new LoaderException("Error reading magic number from file " + labelFileName); - } - return metaData; - } -} - diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageMetaData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageMetaData.java deleted file mode 100644 index 5f50dd5..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/image/ImageMetaData.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.edux.ml.mlp.core.network.loader.image; - -import de.edux.ml.mlp.core.network.loader.AbstractMetaData; - -public class ImageMetaData extends AbstractMetaData { - private int width; - private int height; - - public int getWidth() { - return width; - } - - public void setWidth(int width) { - this.width = width; - } - - public int getHeight() { - return height; - } - - public void setHeight(int height) { - this.height = height; - } - - @Override - public void setItemsRead(int itemsRead) { - super.setItemsRead(itemsRead); - super.setTotalItemsRead(super.getTotalItemsRead()+itemsRead); - - } -} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistBatchData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistBatchData.java new file mode 100644 index 0000000..d8fd07d --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistBatchData.java @@ -0,0 +1,5 @@ +package de.edux.ml.mlp.core.network.loader.mnist; + +import de.edux.ml.mlp.core.network.loader.AbstractBatchData; + +public class MnistBatchData extends AbstractBatchData {} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistLoader.java new file mode 100644 index 0000000..48b85ee --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistLoader.java @@ -0,0 +1,173 @@ +package de.edux.ml.mlp.core.network.loader.mnist; + +import de.edux.ml.mlp.core.network.loader.BatchData; +import de.edux.ml.mlp.core.network.loader.Loader; +import de.edux.ml.mlp.core.network.loader.MetaData; +import de.edux.ml.mlp.exceptions.LoaderException; +import java.io.DataInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class MnistLoader implements Loader { + private String imageFileName; + private String labelFileName; + private int batchSize; + private DataInputStream imageInputStream; + private DataInputStream labelInputStream; + private MnistMetaData metaData; + private Lock readLock = new ReentrantLock(); + + public MnistLoader(String imageFileName, String labelFileName, int batchSize) { + this.imageFileName = imageFileName; + this.labelFileName = labelFileName; + this.batchSize = batchSize; + } + + @Override + public MetaData open() { + imageInputStream = getImageInputStream(imageFileName); + labelInputStream = getImageInputStream(labelFileName); + return readMetaData(); + } + + private DataInputStream getImageInputStream(String filename) { + try { + return new DataInputStream(new FileInputStream(filename)); + } catch (Exception e) { + e.printStackTrace(); + throw new LoaderException(" Error opening file " + filename); + } + } + + @Override + public void close() { + metaData = null; + try { + imageInputStream.close(); + labelInputStream.close(); + + } catch (IOException e) { + throw new LoaderException("Error closing file " + imageFileName); + } + } + + @Override + public MetaData getMetaData() { + return metaData; + } + + @Override + public BatchData readBatch() { + readLock.lock(); + MnistBatchData batchData; + try { + batchData = new MnistBatchData(); + int inputItemsRead = readInputBatch(batchData); + int expectedItemsRead = readExpectedBatch(batchData); + + if (inputItemsRead != expectedItemsRead) { + throw new LoaderException( + "Number of input items read does not match number of expected items read"); + } + metaData.setItemsRead(inputItemsRead); + } finally { + readLock.unlock(); + } + return batchData; + } + + private int readExpectedBatch(MnistBatchData batchData) { + try { + var totalItemsRead = metaData.getTotalItemsRead(); + var numberItems = metaData.getNumberItems(); + var numberToRead = Math.min(batchSize, numberItems - totalItemsRead); + + var labelData = new byte[numberToRead]; + var expectedSize = metaData.getNumberOfClasses(); + var numberRead = labelInputStream.read(labelData, 0, numberToRead); + + if (numberRead != numberToRead) { + throw new LoaderException("Error reading expected data from file " + labelFileName); + } + + double[] data = new double[numberToRead * expectedSize]; + for (int i = 0; i < numberToRead; i++) { + byte label = labelData[i]; + data[i * expectedSize + label] = 1.0; + } + batchData.setExpectedBatch(data); + return numberToRead; + } catch (IOException e) { + throw new LoaderException("Error reading input data from file " + imageFileName); + } + } + + private int readInputBatch(MnistBatchData batchData) { + var totalItemsRead = metaData.getTotalItemsRead(); + var numberItems = metaData.getNumberItems(); + var numberToRead = Math.min(batchSize, numberItems - totalItemsRead); + + var inputSize = metaData.getInputSize(); + var numberBytesToRead = numberToRead * inputSize; + + byte[] imageData = new byte[numberBytesToRead]; + + try { + var numberRead = imageInputStream.read(imageData, 0, numberBytesToRead); + if (numberRead != numberBytesToRead) { + throw new LoaderException("Error reading input data from file " + imageFileName); + } + double[] data = new double[numberBytesToRead]; + + for (int i = 0; i < numberBytesToRead; i++) { + data[i] = (imageData[i] & 0xFF) / 256.0; + } + batchData.setInputBatch(data); + return numberToRead; + } catch (IOException e) { + throw new LoaderException("Error reading input data from file " + imageFileName); + } + } + + private MetaData readMetaData() { + int numberItems = 0; + metaData = new MnistMetaData(); + try { + int magicNumber = labelInputStream.readInt(); + if (magicNumber != 2049) { + throw new LoaderException("Invalid magic number in file " + labelFileName); + } + + numberItems = labelInputStream.readInt(); + metaData.setNumberItems(numberItems); + + } catch (IOException e) { + throw new LoaderException("Error reading magic number from file " + labelFileName); + } + + try { + int magicNumber = imageInputStream.readInt(); + if (magicNumber != 2051) { + throw new LoaderException("Invalid magic number in file " + labelFileName); + } + + if (numberItems != imageInputStream.readInt()) { + throw new LoaderException("Number of labels and images do not match"); + } + + int height = imageInputStream.readInt(); + int width = imageInputStream.readInt(); + metaData.setInputSize(height * width); + metaData.setNumberOfClasses(10); + metaData.setNumberBatches((int) Math.ceil(numberItems / batchSize)); + metaData.setHeight(height); + metaData.setWidth(width); + + } catch (IOException e) { + throw new LoaderException("Error reading magic number from file " + labelFileName); + } + return metaData; + } +} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistMetaData.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistMetaData.java new file mode 100644 index 0000000..026c557 --- /dev/null +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/mnist/MnistMetaData.java @@ -0,0 +1,30 @@ +package de.edux.ml.mlp.core.network.loader.mnist; + +import de.edux.ml.mlp.core.network.loader.AbstractMetaData; + +public class MnistMetaData extends AbstractMetaData { + private int width; + private int height; + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + @Override + public void setItemsRead(int itemsRead) { + super.setItemsRead(itemsRead); + super.setTotalItemsRead(super.getTotalItemsRead() + itemsRead); + } +} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/test/TestLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/test/TestLoader.java index f369d99..12401f5 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/test/TestLoader.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/test/TestLoader.java @@ -6,71 +6,70 @@ import de.edux.ml.mlp.util.Util; public class TestLoader implements Loader { - private MetaData metaData; + private MetaData metaData; - private int numberItems = 9; - private int inputSize = 500; - private int expectedSize = 3; - private int numberBatches; - private int batchSize = 0; - private int totalItemsRead; - private int itemsRead; + private int numberItems = 9; + private int inputSize = 500; + private int expectedSize = 3; + private int numberBatches; + private int batchSize = 0; + private int totalItemsRead; + private int itemsRead; - public TestLoader(int numberItems, int batchSize, int inputRows) { - this.inputSize = inputRows; - this.numberItems = numberItems; - this.batchSize = batchSize; - this.metaData = new TestMetaData(); - metaData.setNumberItems(numberItems); + public TestLoader(int numberItems, int batchSize, int inputRows) { + this.inputSize = inputRows; + this.numberItems = numberItems; + this.batchSize = batchSize; + this.metaData = new TestMetaData(); + metaData.setNumberItems(numberItems); - numberBatches = numberItems / batchSize; - - if (numberItems % batchSize != 0) { - numberBatches++; - } - - metaData.setNumberBatches(numberBatches); - metaData.setInputSize(inputSize); - metaData.setExpectedSize(expectedSize); + numberBatches = numberItems / batchSize; + if (numberItems % batchSize != 0) { + numberBatches++; } - @Override - public MetaData open() { - return metaData; - } + metaData.setNumberBatches(numberBatches); + metaData.setInputSize(inputSize); + metaData.setNumberOfClasses(expectedSize); + } - @Override - public void close() { - totalItemsRead = 0; - } + @Override + public MetaData open() { + return metaData; + } - @Override - public MetaData getMetaData() { - return metaData; - } + @Override + public void close() { + totalItemsRead = 0; + } - @Override - public synchronized BatchData readBatch() { - if (totalItemsRead == numberItems) { - return null; - } - itemsRead = batchSize; + @Override + public MetaData getMetaData() { + return metaData; + } - totalItemsRead += itemsRead; - int excessItems = totalItemsRead - numberItems; + @Override + public synchronized BatchData readBatch() { + if (totalItemsRead == numberItems) { + return null; + } + itemsRead = batchSize; - if (excessItems > 0) { - totalItemsRead -= excessItems; - itemsRead -= excessItems; - } - var io = Util.generateTrainingArrays(inputSize, expectedSize, itemsRead); + totalItemsRead += itemsRead; + int excessItems = totalItemsRead - numberItems; - var batchData = new TestBatchData(); - batchData.setInputBatch(io.getInput()); - batchData.setExpectedBatch(io.getOutput()); - metaData.setTotalItemsRead(totalItemsRead); - metaData.setItemsRead(itemsRead); - return batchData; + if (excessItems > 0) { + totalItemsRead -= excessItems; + itemsRead -= excessItems; } + var io = Util.generateTrainingArrays(inputSize, expectedSize, itemsRead); + + var batchData = new TestBatchData(); + batchData.setInputBatch(io.getInput()); + batchData.setExpectedBatch(io.getOutput()); + metaData.setTotalItemsRead(totalItemsRead); + metaData.setItemsRead(itemsRead); + return batchData; + } } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/Optimizer.java b/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/Optimizer.java deleted file mode 100644 index b4f8f1b..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/Optimizer.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.edux.ml.mlp.core.network.optimizer; - -public interface Optimizer { - - -} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/SGD.java b/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/SGD.java deleted file mode 100644 index fc293c6..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/optimizer/SGD.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.edux.ml.mlp.core.network.optimizer; - -import de.edux.ml.mlp.core.tensor.Matrix; - -public class SGD { - public void updateWeights(Matrix weights, Matrix weightErrors, float learningRate) { - for (int i = 0; i < weights.getRows(); i++) { - for (int j = 0; j < weights.getCols(); j++) { - weights.set(i, j, weights.get(i, j) - learningRate * weightErrors.get(i, j)); - } - } - } -} diff --git a/lib/src/main/java/de/edux/ml/mlp/core/transformer/Transform.java b/lib/src/main/java/de/edux/ml/mlp/core/transformer/Transform.java deleted file mode 100644 index 16caad6..0000000 --- a/lib/src/main/java/de/edux/ml/mlp/core/transformer/Transform.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.edux.ml.mlp.core.transformer; - -public enum Transform { - DENSE, RELU, SOFTMAX; -} diff --git a/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java b/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java new file mode 100644 index 0000000..fb13fb5 --- /dev/null +++ b/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java @@ -0,0 +1,69 @@ +package de.edux.core.network; + +import de.edux.ml.api.ExecutionMode; +import de.edux.ml.mlp.core.network.NetworkBuilder; +import de.edux.ml.mlp.core.network.layers.DenseLayer; +import de.edux.ml.mlp.core.network.layers.ReLuLayer; +import de.edux.ml.mlp.core.network.layers.SoftmaxLayer; +import de.edux.ml.mlp.core.network.loader.MetaData; +import de.edux.ml.mlp.core.network.loader.fractality.FractalityLoader; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class FractalityNetworkTest { + + private static FractalityLoader fractalityTrainLoader; + private static FractalityLoader fractalityTestLoader; + + @BeforeAll + static void setUp() { + fractalityTrainLoader = + new FractalityLoader( + "src/test/resources/fractality/train/class", + "src/test/resources/fractality/train/images.csv", + 5, + 256, + 256); + + fractalityTestLoader = + new FractalityLoader( + "src/test/resources/fractality/test/class", + "src/test/resources/fractality/test/images.csv", + 5, + 256, + 256); + } + + @Test + public void shouldTrain() { + int batchSize = 5; + ExecutionMode singleThread = ExecutionMode.SINGLE_THREAD; + int epochs = 5; + float initialLearningRate = 0.1f; + float finalLearningRate = 0.001f; + + MetaData trainMetaData = fractalityTrainLoader.open(); + int inputSize = trainMetaData.getInputSize(); + int outputSize = trainMetaData.getNumberOfClasses(); + fractalityTrainLoader.close(); + + // Training from scratch + new NetworkBuilder() + .addLayer(new DenseLayer(inputSize, 256)) + .addLayer(new ReLuLayer()) + .addLayer(new DenseLayer(256, 256)) + .addLayer(new ReLuLayer()) + .addLayer(new DenseLayer(256, 256)) + .addLayer(new ReLuLayer()) + .addLayer(new DenseLayer(256, outputSize)) + .addLayer(new SoftmaxLayer()) + .withBatchSize(batchSize) + .withLearningRates(initialLearningRate, finalLearningRate) + .withExecutionMode(singleThread) + .withEpochs(epochs) + .build() + .printArchitecture() + .fit(fractalityTrainLoader, fractalityTestLoader) + .saveModel("fractality.edux"); + } +} diff --git a/lib/src/test/java/de/edux/core/network/loader/LoaderTest.java b/lib/src/test/java/de/edux/core/network/loader/LoaderTest.java index 785eec7..3b70c65 100644 --- a/lib/src/test/java/de/edux/core/network/loader/LoaderTest.java +++ b/lib/src/test/java/de/edux/core/network/loader/LoaderTest.java @@ -11,41 +11,38 @@ class LoaderTest { - @Test - void shouldOpen() { - var batchSize = 33; - Loader loader = new TestLoader(600, batchSize, 33); - MetaData metaData = loader.open(); + @Test + void shouldOpen() { + var batchSize = 33; + Loader loader = new TestLoader(600, batchSize, 33); + MetaData metaData = loader.open(); - int numberItems = metaData.getNumberItems(); - int lastBatchSize = numberItems % batchSize; - int numberBatches = metaData.getNumberBatches(); + int numberItems = metaData.getNumberItems(); + int lastBatchSize = numberItems % batchSize; + int numberBatches = metaData.getNumberBatches(); - for (int i = 0; i = -xavier && weight <= xavier, - "Weight should be in the range of Xavier initialization"); - } - } - - @Test - public void testHeInitialization() { - int inputSize = 10; - double[] weights = new double[inputSize]; - weights = Initialization.HE.weightInitialization(inputSize, weights); - - double he = Math.sqrt(2.0 / inputSize); - for (double weight : weights) { - assertTrue( - weight >= -he && weight <= he, "Weight should be in the range of He initialization"); - } - } -} diff --git a/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java b/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java new file mode 100644 index 0000000..68400af --- /dev/null +++ b/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java @@ -0,0 +1,49 @@ +package de.edux.ml.mlp.core.network.loader.fractality; + +import static org.junit.jupiter.api.Assertions.*; + +import de.edux.ml.mlp.core.network.loader.MetaData; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class FractalityLoaderTest { + + private static FractalityLoader fractalityLoader; + + @BeforeAll + static void setUp() { + fractalityLoader = + new FractalityLoader( + "src/test/resources/fractality/test/class", + "src/test/resources/fractality/test/images.csv", + 5, + 256, + 256); + } + + @Test + void shouldLoadCSVContent() { + assertEquals(120, fractalityLoader.getCsvContent().size()); + assertTrue(fractalityLoader.getCsvContent().values().stream().allMatch(s -> s != null)); + } + + @Test + void shouldReadMetaData() { + MetaData metaData = fractalityLoader.open(); + assertEquals(120, metaData.getNumberItems()); + assertNotNull(fractalityLoader.getMetaData()); + assertEquals(6, metaData.getNumberOfClasses()); + assertEquals(24, metaData.getNumberBatches()); + assertEquals(0, metaData.getTotalItemsRead()); + assertEquals(5, metaData.getBatchLength()); + } + + @Test + void shouldReadBatches() { + MetaData metaData = fractalityLoader.open(); + for (int i = 0; i < metaData.getNumberBatches(); i++) { + var batchData = fractalityLoader.readBatch(); + assertNotNull(batchData); + } + } +} diff --git a/lib/src/test/resources/fractality/test/images.csv b/lib/src/test/resources/fractality/test/images.csv new file mode 100644 index 0000000..e8cd165 --- /dev/null +++ b/lib/src/test/resources/fractality/test/images.csv @@ -0,0 +1,121 @@ +image,label +f3080922-398b-45d1-830f-1c897ebab78a,tricorn +6470d79f-f55d-430b-9fd2-7687588cf699,tricorn +3b6faf64-c284-421b-82e1-defff8f6dbf5,tricorn +157699a8-a81a-40b8-97b0-fddf61194e51,tricorn +e91f9739-1df5-492f-a75e-621cd3528f5a,tricorn +d8b6aa60-fb95-4a44-937b-6f8cc79da120,tricorn +55fbaca0-c876-452b-b162-b9750f85d79d,tricorn +db16ff25-e871-4632-bf20-ba7635f906e2,tricorn +0e8f2753-3160-4dc5-8080-8654ff8f6ae7,tricorn +3564b36e-5e76-4aa0-936d-b3b10dd8227d,tricorn +de734713-09cd-4625-a8aa-31525460bdc7,tricorn +abace5aa-5620-46ba-aea5-91e98cdc1af8,tricorn +46628591-024b-4e9a-abe7-0dc45e278dd6,tricorn +5a27e662-43a1-4bca-ba20-dac5079c44f4,tricorn +6fb7b091-b349-4fb5-b385-cdb2cf829b63,tricorn +ae3bfd89-2c32-4822-bd9c-c53a62322e80,tricorn +8919393d-d071-4bf3-960c-ac920a7ae603,tricorn +31037598-b391-45bf-b3f6-d7f343d7c790,tricorn +f92c4058-a446-4f62-968a-ed83e25bd14c,tricorn +7f1abe22-4d73-4ee0-9d31-65accb9556a8,tricorn +a39a5142-eb22-47cc-9171-dcfcfd091bae,mandelbrot +a723ba00-9d98-44aa-a596-0d50409915fe,mandelbrot +ecf87efc-4195-4b84-ba83-1b8cf2f4f20d,mandelbrot +4da48b8a-fc00-460b-95a9-593c7c564908,mandelbrot +6a8ee5e9-0eeb-4343-b07e-6929efef064c,mandelbrot +dd274444-0bdf-466c-861f-87176bf95a81,mandelbrot +05c7355c-6053-442c-8853-eff85db071a0,mandelbrot +41719455-76bd-46cf-95ac-32abaaa005ee,mandelbrot +d55599bc-5153-4911-b395-f115c9e1d16f,mandelbrot +fa70ace6-0ffa-4cb2-9bc7-1c95b90cb847,mandelbrot +a105c7e3-5aff-43c4-bf4f-b5223cfcfe91,mandelbrot +78d13544-6552-4abc-a8db-80216e8a2c89,mandelbrot +88caa3c2-1cb5-4999-885b-3ed87286930c,mandelbrot +71e8a242-b432-4d6f-a12b-34a5375d4626,mandelbrot +64588133-878a-457d-a4d7-73bfa10add33,mandelbrot +3aad6321-fef5-4fc9-b98f-3ddcedda1f49,mandelbrot +1d7b6e18-579b-4cd2-b606-13437f2b3e8b,mandelbrot +43af1aa5-2cdd-488f-8d91-3b76df849d9f,mandelbrot +e12f952f-fa07-4d3f-8d98-0f3e1fcef198,mandelbrot +c0518916-f0da-486c-8d9b-1643b376a741,mandelbrot +b38a1110-59f1-49b7-a288-1bb74c9dbe15,julia +92c406a9-94be-4577-8558-709c1881db05,julia +cb17ee00-84ec-4b99-b080-964338922fa7,julia +e85522f2-3317-49ac-b9b2-276eab30071b,julia +f6cd6c77-e108-4db3-8196-cb0fe2d08b78,julia +bd3c637d-c1cf-499a-9222-e9b3fedd9d80,julia +c72bf748-3974-4db6-9eed-04ffaea80f98,julia +5d467802-2cad-4ddd-b8e5-6db87654f699,julia +82c7f303-3c5d-48c6-a6c2-d800ccd3480e,julia +2fd8f43c-418c-4f93-96e2-59a00cabbde4,julia +1617ceb6-9b82-4364-aba0-c0e8aa857b6e,julia +f7dbd74d-8b73-454f-b15c-589ea21a17ac,julia +b136d99d-71d2-4489-808c-c4a3f42629c9,julia +a5de1b8a-7c71-45d9-89e1-17caee80067f,julia +3a8458d5-75be-42f0-8527-7aa41fa9b4f3,julia +9cb8eafe-8b9a-48f7-b9ff-0b57e321e868,julia +6ac4e335-ed85-4b3e-9e91-62031eb6351e,julia +7b12a311-d8f0-4359-9253-f73a425e324a,julia +130ebbb1-deb1-4df3-883f-ff06b756f73e,julia +319089a3-26ea-41eb-8434-4200122f1605,julia +3c1cf4d9-a399-482b-b633-103728740b03,burningship +61b792d7-32d6-4197-b72a-3d9b5067602a,burningship +30f0ab65-0efa-4e1c-9255-d6a68596c167,burningship +6af0ca39-9808-4409-975e-f00893a8d4ec,burningship +64431801-0e60-4e1d-b6c9-9d3e219dc366,burningship +84fd14e1-e57e-4c3e-bab5-612cbb5dc238,burningship +0a5224e3-5b09-4d5e-a6bf-776615b2c4bf,burningship +69c954fb-967e-4121-ae29-8d577c682485,burningship +c6c67a9a-0079-40a1-9448-7ab8e055ab80,burningship +6757fd70-0661-4d83-9629-984f3081cbb4,burningship +c6473931-114d-4369-a359-abd08734f0f0,burningship +4caaeb09-d654-4e8a-82de-d1302059c7b7,burningship +bbeb4c98-c405-464e-8dac-a67384c2cf03,burningship +721342a9-8b25-4f9c-89b9-aca81459414b,burningship +59cc3d7f-aebe-4467-823d-dd7ad3c61abe,burningship +c8820142-20d2-4729-b777-6ccdbc32d47a,burningship +c4bfeecd-d932-40c6-9ea3-475b152233d1,burningship +7ccbd209-89ac-4ac6-91f1-6bb43b451b5b,burningship +e4a44430-018a-4b84-9851-1cac47fff8ba,burningship +f0734909-8847-49e5-a407-ba0178222e7c,burningship +33de1e43-6c81-4092-80cc-e6efb2a7c71b,sierpinski_gasket +fb6de425-6ce8-4d55-add5-7f669649f604,sierpinski_gasket +3cdd48f2-0224-4e3b-833b-0f8442ab3411,sierpinski_gasket +7c09b65b-16c3-4d62-807b-1299af476513,sierpinski_gasket +f073ec60-f2c5-4090-a416-230f8447030b,sierpinski_gasket +b8e74c8a-a00a-448e-99dc-4fae1a102e1a,sierpinski_gasket +421e1016-8db1-4006-a09c-c7c33ee1a057,sierpinski_gasket +e7983811-70c2-4dc6-bc3e-057a3e31471e,sierpinski_gasket +c1ca5428-2cb1-41dd-911b-efea6c1b7659,sierpinski_gasket +d9675f25-7bac-4841-b35f-eede874ad280,sierpinski_gasket +85d617c5-bd55-4a18-98a7-5983ce810117,sierpinski_gasket +0e5e8d7e-c984-4aab-ab2d-e9ceec505aff,sierpinski_gasket +f0255fe7-c782-4598-8df3-76d3a780dffd,sierpinski_gasket +ac78f348-a5a3-4cd5-9e2a-27edb8ae75a5,sierpinski_gasket +e3d8da66-845d-42ca-8361-a6dd8fe149d8,sierpinski_gasket +1621534e-1945-4945-93b3-a8db7bf7c16d,sierpinski_gasket +10e745c4-14be-4a3c-84e7-a37370e7363f,sierpinski_gasket +175a204d-6223-476d-ba6c-9bfd3ccceb4f,sierpinski_gasket +17b189f4-7d8b-44b2-9d66-77d3208c210a,sierpinski_gasket +89a180c6-3f89-42d9-8219-dba3e100cc86,sierpinski_gasket +455237e4-26b4-4961-880e-645f26aee863,newton +665678db-1f52-4780-a81f-4be1bd2e3301,newton +2b52dcf9-b491-45cf-9adb-71f21d39e6ea,newton +44437199-c272-4a2e-8f6c-a1ae321168b5,newton +aacd5a3e-5e57-4250-91a0-e6a0d9e1d83b,newton +01243f47-658c-48ab-aba3-e99c193a22d6,newton +b6931dd4-3714-412e-93f2-dd9f42705dd5,newton +4345753b-3958-4e12-9c15-ed0a7dbbc4dc,newton +e4a6328a-85b7-4f4a-a05f-1e24c1327f84,newton +8ff14127-365a-4478-9575-34df051c4c01,newton +650fb63c-7c41-4f02-8bc2-ce8f0541ae91,newton +c189265d-1903-429e-a78f-c2916d4544d2,newton +7b9f2656-299e-439f-9f53-16cd08d1c174,newton +7d2170e5-9025-4e2f-8b9a-36129ee8c9ed,newton +cdef4073-420e-44e2-9be2-2882199bef81,newton +99488c27-35e8-49c7-af7b-e39e96b939c2,newton +12f99c37-6b43-490c-a2f1-6ed7de0e8a09,newton +f7af4a3e-bae0-42db-beb0-e30dfe8e2e58,newton +2d260a47-05a6-4c59-bdb9-71d90163607c,newton +7e0c41b6-55c3-4dc6-a375-ab5d8d9bea61,newton diff --git a/lib/src/test/resources/fractality/train/images.csv b/lib/src/test/resources/fractality/train/images.csv new file mode 100644 index 0000000..6799349 --- /dev/null +++ b/lib/src/test/resources/fractality/train/images.csv @@ -0,0 +1,600 @@ +image,label +8c1a5f9b-f637-431f-9c71-24dfdd5bee84,tricorn +82337da9-8eaa-4c58-b0c7-6ce8c29adec7,tricorn +a5653571-9c95-4c99-a8ed-d16326383bbd,tricorn +86332140-2447-4e8e-a7ad-2a6119d6e8cf,tricorn +ddaf575c-6554-456d-a373-9cafd580d8da,tricorn +5ae6be53-455a-417b-b37d-4c6a5de852b6,tricorn +67de5f90-fe3d-4783-b810-e3afedd126c2,tricorn +d02882a5-2d84-4448-90b3-17cc3b14e025,tricorn +d84c168d-b814-4892-9d24-ba355078adcb,tricorn +68909607-a7f7-42b3-8cde-ac57fc184a05,tricorn +22a37a1d-ad80-4505-9ce7-2fc16ea16162,tricorn +6345b719-047d-4e70-af2d-4c664332dee7,tricorn +b5b5b6ae-b0e0-4fe8-b16e-00ec3a05c45f,tricorn +fc60e7e8-e5c5-4d3e-85fd-ccaf3412a9cc,tricorn +6fc69a0b-74a7-47ae-bd8b-14be452916be,tricorn +b8a86509-dee9-4b5a-b923-e0e7e55402e1,tricorn +f3484617-5de6-4029-8129-36fe477d8662,tricorn +aeee27b8-9d5c-48d2-9d82-ba9557f39e12,tricorn +d9d455d5-2b6f-4031-9e97-9c63f96a2b24,tricorn +09762164-cee0-42c0-be58-e10c9bda185f,tricorn +7cbee46d-70af-4f37-8f14-f76e039d7976,tricorn +2acc1e7c-2952-4edc-bd67-d960063807df,tricorn +7b26d687-b831-4050-b620-0012cfe2d2b4,tricorn +59e46e97-39ac-4a79-b5f3-7d212416d347,tricorn +9d6f3a10-d42d-4aa8-a200-240def28ccdb,tricorn +1832dd01-dfc9-43b8-a361-27302a44e9d5,tricorn +7713ef0c-c3a4-43f8-90a1-45be0c989bd2,tricorn +e4dd2e96-83b9-49bc-bca3-a73cd275853e,tricorn +bfe3b4ed-980b-4f32-af62-d7fa0d57095e,tricorn +8c6ee0d2-b90c-4f27-90e1-048eee50c3ae,tricorn +6c5e5742-ad78-4b65-922b-15b29b7c8a0a,tricorn +e9cef493-ff73-48a9-a828-45f7337a9514,tricorn +0e3b0310-5352-4bc2-9f70-3e463fe4f776,tricorn +d8e816de-d2d8-42b9-b038-0d21f745e74d,tricorn +b6eb1a4d-c554-42f6-a0cc-88e24d9729c8,tricorn +c034eddb-4f0f-4448-96b2-ccf7550e61e1,tricorn +6b2ab918-3183-4369-b010-58610069d0c7,tricorn +4d26399d-2010-4686-ae73-691a2c8b2378,tricorn +b35774e2-67b7-41c4-848c-31b1e9b29fcc,tricorn +3eb133de-e918-4c89-b43f-39a8ed1a561f,tricorn +90a6e5c5-efec-44aa-9d96-118def1076a9,tricorn +1b7abd07-2415-47ad-8217-c0512edc70a9,tricorn +289e74f7-e35b-44fd-b3c1-1288ef3bc781,tricorn +0ebd8aa6-c579-4cfe-85ab-0b6fc9dac085,tricorn +8239a2d9-d030-4649-b893-74f5d770d0cc,tricorn +1fb6bf47-f501-4864-bf16-7ababa46428c,tricorn +827d0b8f-481c-4b3c-85c1-6f166a2c4faa,tricorn +06ca4c87-b42a-46d6-82cb-d16a7af024ea,tricorn +0946b47b-a839-4275-96f7-a0838231c62a,tricorn +9cea0760-6b18-4660-a191-ff81f9784b8f,tricorn +689aacef-3fce-4b00-a898-91a8edbefff0,tricorn +3d1f1b4e-d70b-4525-aa5d-4844c58cd6a4,tricorn +0593781c-e226-4872-be2c-4ca03e1e9af4,tricorn +d72651de-255b-48c4-ad21-e24a10b1c118,tricorn +ccebe960-ac42-404a-a290-5029558c6af6,tricorn +820fe220-d42e-44c8-ae7a-61876be59639,tricorn +3710f232-bf65-4599-a428-a82a0ea974ea,tricorn +caeab843-f7b7-4e40-bd24-d0b6371323d6,tricorn +65ec548f-2ea6-4084-b460-65ac8fce5bcd,tricorn +769b3fa4-ae40-4d2e-b7b2-accc8b865d66,tricorn +8a309afc-ead8-4fc0-813d-8baaf2ec8c39,tricorn +3622b4e6-f577-4a07-8ca2-aed2efa3c54e,tricorn +e59cae40-5f14-4845-be7e-7a8b6ebe1a3c,tricorn +50996c35-1a71-4244-adf7-a4d7e761e5e1,tricorn +17e119e0-b168-4a19-846f-f67b20f4c1f0,tricorn +e18c97ae-df86-49a0-b719-ad0230fc8f60,tricorn +5533ec9e-eb89-48b1-a791-015d5048d32b,tricorn +64f96260-de26-475a-adaf-0487f59af671,tricorn +da9cbcde-6f50-44a5-94c7-8b5631e45272,tricorn +8518c329-be81-44aa-bf7f-ac5b483852d7,tricorn +0e526b98-57c4-42e0-8862-5257c2e2a4bf,tricorn +5a163818-d1ce-4f1c-9961-a8c12b6c866c,tricorn +7dab4106-da8c-49b5-b5da-9184d02cf82c,tricorn +718ad663-8434-4f70-bb0e-db1c8f954e6d,tricorn +00b12886-5a25-4099-ac1c-234f333bcbe9,tricorn +b87bba1b-8eeb-486f-abca-1563179aff19,tricorn +d85a4878-08c3-4b60-b566-3ece77f63ac1,tricorn +98c35eeb-fc16-4d26-a4cb-bdae0df2d561,tricorn +058f399c-7d1d-4eb1-8dbc-0c3e888c0f00,tricorn +b23f2cff-569a-4ea3-8f92-e5ecad549770,tricorn +e91d9659-a4f7-4dc4-b852-f5f47f8b9802,tricorn +41b66fb4-1074-4ac4-ae78-5953220a55cd,tricorn +20fdfdde-9451-4a06-8280-2b9ca01c8fb3,tricorn +8ffb9d01-95ab-4b67-b173-47d5925d1c6f,tricorn +96a29e4f-14c8-413b-83e0-706dbb9ccc39,tricorn +ff3e1c5a-e90f-4aab-b4f3-69eaf174c83c,tricorn +3eb1387a-9be4-48e4-99bb-3859e9d3e917,tricorn +85c236f5-53f6-4027-9ea1-36d9bf5d6805,tricorn +b8a71a36-eb3f-467f-bc68-d2b76d3fff98,tricorn +3bce1ec8-7dfe-412c-a72c-79c200907f85,tricorn +0cb39ea3-2d0d-4995-9203-7a770501518f,tricorn +06b26682-5b31-41ba-842c-d927b2c00ba0,tricorn +5fe76099-b7ed-4722-8ade-14f0d197234e,tricorn +59f01bd5-4d15-431e-b1c7-20cb16794977,tricorn +a792ebeb-f25d-463a-a7fa-83756bbedb12,tricorn +59e3bd3b-bdd9-4267-9759-0c1d81ae339c,tricorn +60e6446a-a37f-4456-bfd4-d155865902cb,tricorn +43cc0f3c-b092-4ce9-8bac-e91d8945fa64,tricorn +47667ca4-7efd-47e2-99c9-dfbd18d77ded,tricorn +a195c0d5-d3a3-4c7a-ab10-c720521a4c5b,tricorn +bec05ebd-0de7-49f5-8145-49da680bc191,mandelbrot +a33c0245-0b21-4ca4-a849-74f2832e9d4c,mandelbrot +58a417de-cfa1-4a4c-bcbd-b40097278e2d,mandelbrot +002fbfed-3ee6-41ef-9196-dc1f2f319d2a,mandelbrot +be5ec8ca-ab5b-42f8-b5d1-03d51d930aa4,mandelbrot +3e112a38-269b-4423-b9e8-781f5ff0fe67,mandelbrot +31dbc736-4549-4fbf-9d0c-8a2a6687d77e,mandelbrot +6b84d3e4-684f-41ca-bd1c-bb492a1b1690,mandelbrot +6bc3b748-ef79-4fc6-bb3e-ad2ba06f3f7d,mandelbrot +44fa2df7-339a-4bbb-ba85-56ff226781f7,mandelbrot +81790a5c-af1b-47bb-ab4a-5ba8875b4b87,mandelbrot +a23ba153-0e12-4a27-847a-6665fa1d68d3,mandelbrot +e4bb6ed0-3b2e-4961-a313-0bbee0172f46,mandelbrot +e9e8aabe-f570-448e-b0fe-953643353866,mandelbrot +3562d06a-3646-4ef8-a9fd-7ed5cdefeb91,mandelbrot +2de981f3-d323-4def-9a65-287735d31675,mandelbrot +99b405da-70a2-4f85-bd96-646b669100f4,mandelbrot +5cb84174-3945-444c-a901-d095b82cc62d,mandelbrot +f28a76db-a518-42a8-8969-17f54ad8db33,mandelbrot +afda8e65-9d62-457b-835d-ffff89db668c,mandelbrot +ca66450f-aab0-40bf-9ab8-5f4e5b383b16,mandelbrot +82a4b499-0e3b-42b5-895e-782dea3c8a8f,mandelbrot +ff929603-1587-4369-aeed-e8370fc0bf96,mandelbrot +42554b02-89da-47bd-b428-70dfab8a20d4,mandelbrot +341728e2-bc14-48d3-b711-c33b3c25c100,mandelbrot +5e4bf7ff-cc96-4340-ab47-9e19948352d7,mandelbrot +58302761-bf6b-4934-b978-bb686f07bed2,mandelbrot +167ee17b-9249-4722-9b78-d784f0b7f9df,mandelbrot +87690c29-ab45-4197-990a-e95e97c1f102,mandelbrot +3eaa76f2-28f2-4146-ae2c-eedcacc369b6,mandelbrot +c17e8423-8bf4-4a1f-80dc-6163984537c5,mandelbrot +5a82f5c7-d738-4f13-b222-ef561d1db79c,mandelbrot +c801f049-d4f2-46bf-ac13-7e1a1d836400,mandelbrot +1886f079-1ae7-4cd0-9d7f-7de5902780ab,mandelbrot +2a9924f8-6bca-442b-9a43-287b2bbf7388,mandelbrot +7d255e57-e751-44be-aa90-b2dd3c2a0fc8,mandelbrot +f55292ba-301b-4b51-b545-882eea52b110,mandelbrot +df547c78-4c45-4423-9bdc-2638ebfa272d,mandelbrot +5025a2e5-7e7b-4d25-969a-c22804876a4a,mandelbrot +9d92ac9d-d5b2-4982-b1da-9d3dcb6f2228,mandelbrot +531232be-3fce-4987-808d-bd78eb1cb5aa,mandelbrot +8e81f45c-53f6-4b74-a833-cd1cb634250b,mandelbrot +36babc18-0d93-492a-9595-a84d3c6d7f47,mandelbrot +7c11ee6c-bd3c-4276-a22e-2831d3e3755f,mandelbrot +d9397b9c-562e-471f-92e3-044efcf35ecc,mandelbrot +5384bb89-0a0d-401f-8738-829efd9f0ac2,mandelbrot +199bec6d-19cf-4148-84a1-44e76229b7ca,mandelbrot +a197c97f-52aa-4c04-a683-5493445be634,mandelbrot +dfe90910-4e1a-4aa6-9989-eebef5322c5b,mandelbrot +bda65e72-5f29-43d3-b564-04765614d451,mandelbrot +839fe35b-8273-482d-a5b1-7005b63b98ad,mandelbrot +c54d66d9-1a2d-48fe-9219-cc09e7027a77,mandelbrot +9d3afe43-82e8-4245-a894-0e79f51fb76a,mandelbrot +0828ca48-f228-436b-936c-97f26d494c53,mandelbrot +217c8cb3-9868-40cf-aa4c-8ee0d1bfa662,mandelbrot +160f14f0-2dc7-4206-a7ef-6bc0721e1c69,mandelbrot +f9def7bd-b7dc-4a9b-9a7a-92ac0eb31e73,mandelbrot +12b31330-dd43-4d4e-ba03-2f380107ccce,mandelbrot +24c4304f-296a-484a-be31-2990e42b7404,mandelbrot +436ebc63-8212-4704-90f6-3c43099a2397,mandelbrot +5bd455fd-6dbe-406f-b9b3-50bfe01ef2bf,mandelbrot +0f219716-3d53-4d52-bf21-86c80b7f585a,mandelbrot +15766e32-7ae4-498a-9c45-7d1756a4e9d7,mandelbrot +1c68d68d-70a7-416b-a82a-e3832fcac5ac,mandelbrot +9eedf607-bc04-48dc-ae9c-2f1039cc9ca5,mandelbrot +6d2c28ab-c482-43ae-87be-2f97099d583c,mandelbrot +136d7ca9-8b31-4841-9140-3ffdcb39b099,mandelbrot +aee98066-be6b-4135-b341-d45190a40bad,mandelbrot +c1c36b16-1228-46dd-b463-c13c4eb67752,mandelbrot +dbc5f804-87c6-4ade-9ef2-fdbb4a6160f3,mandelbrot +67d3e4c6-7149-4d4e-8905-44ae20f0624f,mandelbrot +084bb6ba-dca2-4746-9e65-2908441da93a,mandelbrot +7d8299d6-3874-4169-a7b0-8f10a8087d97,mandelbrot +ae18f000-89b0-4443-885b-57dad28a2530,mandelbrot +d6f5db22-334f-4efe-a146-d3aaacc447ac,mandelbrot +b0afd9e4-599c-4c7d-a7b0-f71bdcace2f9,mandelbrot +df6b8ef9-16f2-43d0-90da-32bb2a928027,mandelbrot +c334b0d2-7aa6-43d9-83d5-fa50e9a6480a,mandelbrot +8dd28b1d-e4b7-4549-ae37-8c18e5ec0a44,mandelbrot +657956ef-66ea-45a0-a9bd-24c76cae2326,mandelbrot +2dfb8a68-096f-4a97-91bb-ec750d791326,mandelbrot +c9be7439-f7ed-41ce-8d76-242760cf2e0a,mandelbrot +3cd6b4b4-c3a0-4385-bc2b-b5f4fb660cbf,mandelbrot +f9953d30-40fd-4c5e-b64a-e42ae3b601fa,mandelbrot +030965b3-5176-4e23-8566-eb4ea83f72c2,mandelbrot +5454dceb-b9d3-49c4-ace7-5269c89cc8f7,mandelbrot +fd5572f8-66f1-4523-8c0c-65d9a82a201e,mandelbrot +e3891f09-e39f-474d-a879-1b70ca2e7bf0,mandelbrot +0b266ee7-a496-49b9-a1f8-ca7086d69a78,mandelbrot +a9c00ff9-75dc-48bd-bdae-056de4338e76,mandelbrot +5535e1f5-d8a0-4eab-a5ab-c5decc58c573,mandelbrot +3cc07fa5-a83e-4e9f-93ed-f12bfa7140b8,mandelbrot +8c211ae4-00f9-4212-bee1-4f43b0c855a0,mandelbrot +d3facfc0-0e6e-4c21-ba38-d1351c03b9e3,mandelbrot +2f602457-063e-455f-8ffb-20789fbfbdcf,mandelbrot +c899cd61-15d7-481f-a0a4-93ab7dcb7a55,mandelbrot +0e8aa4da-913c-4dba-8162-774d32e7fb24,mandelbrot +0b624bfa-780c-48de-af0e-4bb6d42b3344,mandelbrot +14ec5dba-3295-40c5-9414-e9ce369abc00,mandelbrot +1864d893-831a-466f-8c78-3e2122487922,julia +80860573-9f8f-43dc-adca-e49485bf3422,julia +d6fc279d-e1ed-4837-be77-621eb805c019,julia +544beb14-249a-4aba-896e-72914e386042,julia +950ccabf-62d6-4f42-8462-a9f61c1d6eb0,julia +9a1c26e0-dd9c-46ef-a0cc-ad94220ed722,julia +8959ed7a-aff8-4f2d-b771-0a7a5c05a555,julia +3be6b692-2c3d-44c6-9826-e0d21a9c75bc,julia +aa2a5504-6c04-4f95-88e5-690610cbfe83,julia +cf9a2ffb-6ca2-40cb-8c4d-07d6ff6680be,julia +ae81a298-0921-4ff8-b935-9fceadcc0d01,julia +5b20583e-6520-4b2a-9b53-4e319c109245,julia +beca34f8-4fec-4462-b4b6-b9e23866ee97,julia +6f82007c-17e0-43b8-939f-6e642a11c970,julia +76e3bbf8-089f-43f6-adbc-029688bd947a,julia +5806a400-1037-486e-84a5-f3b8926c7931,julia +ee9f9e6f-6769-46bd-af2b-e576cdbdc56f,julia +309dab98-3ac3-4e6b-b34a-334104328e2c,julia +f37ae9a2-1022-4ec8-b9ca-d62550c4f23c,julia +8433d8dc-f10c-441c-b0e4-477ea618bd99,julia +2a0723b3-dd17-4add-90b1-0c3c49935c52,julia +b002d890-f12c-4693-b26b-b4d75b4c7ba0,julia +8bee23c5-bd25-45c9-ad48-18a1667c29d6,julia +111da9e2-c869-4378-bd39-e3d4128074ce,julia +ffba4ac0-b4e4-4844-881a-5345895ccc7d,julia +e4b09098-49de-4be8-a287-0e7e286531a1,julia +bf849bc0-726e-4258-adab-7f7be2ce0a3b,julia +f64c5c90-9666-493d-9ac8-9ebf74b725a3,julia +04687592-685b-4321-833c-da5349db514a,julia +db295a6e-fe79-4021-91e0-d153d7c9f792,julia +eeea4360-825a-472d-ac32-31d7e66d9def,julia +c6d0111c-a427-4a74-a75d-410b77eb3dd7,julia +ef7e608c-bf96-493a-a0cf-3543101d0bb5,julia +22ddaec9-9b84-4256-b64a-f26ff130b025,julia +60d0899f-1711-48bf-b2cc-bd6d7f8e27d4,julia +4b29c860-f036-4c74-89b0-ee534a20aa7d,julia +1e74a978-18e2-4b3c-bd89-79a5bf30e429,julia +b75309e4-8fb2-482b-8683-07fd4c1a1ab4,julia +3b0da231-1f38-4b4f-a23a-c545106a3f66,julia +ee8079a2-05f4-4b93-b8b4-606abc7bab49,julia +d3cdcebf-ee25-42d5-9077-05cc3592b4e6,julia +dd42f0c6-4b38-4314-8338-149805ccd9eb,julia +27235d94-2de3-4c5b-a16b-ce4d7c2b7f4a,julia +a3e7b95a-e66c-4358-8041-936b345ec742,julia +7591531d-037d-4bac-974d-c3c049d16398,julia +29ef6830-d320-4400-b3d2-515e73d4670e,julia +5d7281ec-c9a6-4a79-bd5c-dc84549db826,julia +089b3813-e22d-46c7-be26-980a3d53de65,julia +98576043-ab8a-4cfe-b72a-c355beea1a55,julia +ef6cf5f7-1986-4b8d-9847-04892ba2c377,julia +56333e61-83db-4cb3-9a57-e64a80902cfc,julia +2b184f98-365e-42c1-81db-348b638a8a70,julia +26e6dea1-03fe-4122-ad0d-78b4dd5cf4d3,julia +49625de6-7bec-4b98-bfb1-b80e7084c5b9,julia +4ebac2e9-aa09-4b7b-a876-6ab8495955d1,julia +a5d927ed-5ece-4bc8-b4b0-692e693c3cfe,julia +12ea3437-e610-42ae-96f2-0b8221e44295,julia +9fd7ff5a-d3dd-4e1d-819b-d87b54095279,julia +82094db6-2cce-4992-a2c3-79828332e6aa,julia +e0441bae-89db-4fa9-9b5c-6ef5e0dc24d9,julia +087af3f6-8832-44d5-91ee-90802a1249a5,julia +ea6116c4-797c-44ec-b6df-ea02ef73f7f9,julia +97575896-8d1e-4be4-974c-9c86bd22696f,julia +f5623b9b-c1e6-47df-a094-ae9200d4de20,julia +115b2363-9c58-4bd4-a589-1cc8b2c98560,julia +92191228-682a-40f9-b840-ec2df7bfe7a5,julia +76cf8c16-11cb-48f5-9826-231ccd8e3e46,julia +1f4b5ed6-622c-4d1b-aff4-6eed04633e1b,julia +b378e75f-c0c7-4f53-af9e-8ddbca862a92,julia +8c446c22-3fc8-4d31-84c5-748c0f1400d7,julia +3ae17a20-c5e6-4ca3-b26f-151f676a6812,julia +dd5a9915-6eb8-4a1f-a075-06d6076afb6e,julia +844342e9-9aa8-49b6-ac22-ef35c7038337,julia +6bee4fb2-a9b4-475a-9dfb-d4fa3303d946,julia +48e12e73-b5d6-4731-b2ac-875b5d55267c,julia +466f2c20-bb79-4c8e-945d-a25d6561614c,julia +906a8f26-4d84-4a86-b552-2f4d7f91a195,julia +3defc920-7495-4978-a50d-bfac56a0d8b6,julia +c294b050-0cab-40a6-b869-efde08a83cbb,julia +383aa246-8116-44b9-bd17-503ea72f1210,julia +46917145-bc5a-4208-a0ca-1ee745c5fc54,julia +60b01beb-17bc-4a62-9f58-e69966f67052,julia +570cabf3-7ccc-41bc-a4ce-a5172f53dc4e,julia +580d3197-f723-4bf4-ac5a-5840e0206d26,julia +acc55d07-0d4f-4e73-9d68-c2f9b84092ca,julia +e25e1d90-a10a-4176-8d45-18b3a2027006,julia +c0dabe49-ba3b-4f48-b86d-59927ef73797,julia +b12ae1d6-2723-4413-bdb6-3a2cc523a46c,julia +ad12445d-de90-4a9e-abb8-19c3a7ee4dfc,julia +93321dd6-d970-400f-9448-c85255d1caaa,julia +f2afc059-efc3-47ac-97e6-b727b6da1ac0,julia +c9d5665c-093f-42e5-963a-63abd8c99b7a,julia +a54b267c-e521-4bc9-af32-1a8b5fcf0ec8,julia +c253250c-882c-4e85-8a4f-b97ce7182363,julia +162acfd1-ef33-418b-93f3-40ef4a23ac4c,julia +4959b1cd-b3dd-4beb-acd2-b1b3cfd6e639,julia +2145d36f-5a0f-4eeb-bd5f-4f1d18cbc7f2,julia +09ad79a4-1fef-4aef-8222-ff60259734cd,julia +c2a53bf0-5b60-4512-8f15-5315acce09df,julia +46a88391-18fd-4f87-bbd7-5599c2e458a9,julia +09823041-d25f-4e90-bbbc-e6a919c5562c,burningship +7c0f7b61-7e85-4c38-aafc-51a9f91b2ce3,burningship +12abfc34-231a-41d7-b62c-f4658962f7bb,burningship +25e24133-9baf-4a10-a179-f19e145fb9bf,burningship +5b71efa8-e44b-441d-9aa1-6bc1dafd845a,burningship +5e235c18-2f25-423e-96fd-e0fbd19f5aed,burningship +2e189879-75d2-48e4-9bb8-f3c8c56ab870,burningship +a387445b-432e-4e98-9ace-40fcbf03ce46,burningship +a662066c-a5e2-4f04-a860-57b2c00d03db,burningship +15cecb58-5026-4221-8334-36003387e0cf,burningship +399b3ae5-56a4-4bc5-bc4b-abc429a47904,burningship +fa52207e-38cd-4d29-8761-15d808cf7038,burningship +8fa8d69e-ab60-4784-9e31-fc921cc5e65f,burningship +d1b0f0d5-564f-4706-8804-ece8a185a085,burningship +34fe8d22-fde3-43b5-b284-e6009d954cd7,burningship +d8d65616-91c0-4255-9aba-1d0ba28de305,burningship +160c4b6a-1aef-4753-ad48-073ce1df953f,burningship +1d34cacc-8c3a-48c7-8319-02b2385eda98,burningship +8287dae8-a43d-4c20-b176-659af7c009a5,burningship +003ad781-aa29-4ebe-8a6b-46715dfd173f,burningship +4fe48488-30c8-484f-bf95-f9b9717f85da,burningship +1f5757a5-ffc4-45a4-ac48-f7cb62b13cca,burningship +37d05b81-ccb4-4a32-94ed-fce658dacc98,burningship +ddbb450d-a6d0-4c48-b34e-a0b28e497d60,burningship +905443d9-a51c-4fdf-934e-1b643ff9c3a6,burningship +83ff433d-53b9-40a8-99cf-7e00e7fda1be,burningship +74503679-7039-4c1a-a00e-697ca4b5bddf,burningship +e38590d4-df39-438c-ae69-733ba8e7e7fa,burningship +1c2e010d-b0c9-431f-8305-6de071d684e1,burningship +6dd53755-4595-4a2e-9ee0-15ade1c15232,burningship +b6f327f0-6ba1-409b-94aa-d1552a330b17,burningship +4696507a-6c67-4dad-96a6-c1da58454c1f,burningship +738887c2-7014-4d7d-a3c5-c0c2b896834a,burningship +e15429cf-1c51-4cb3-a92b-75a0eef7fdaa,burningship +a8dbf3e9-6333-4e37-aabe-e022a22b989a,burningship +3ad2220f-ac6d-42c7-b62f-bc6413a6e75f,burningship +788d7339-0e74-437d-b38b-83c39b2167ae,burningship +e306610e-c6e6-48ab-8b67-4924a166b6c1,burningship +4280773d-ce0d-49ba-bb6e-8c285a8e2a45,burningship +cb464c4a-c412-4d5f-bdd8-3514e371b13c,burningship +653aaaec-80d8-4c42-840e-01e220ddcfbd,burningship +72aa0b4e-cbb7-4572-94a8-bf6130cf8e60,burningship +4da3737d-958f-4dc1-90ef-c9f9be07e6fa,burningship +5f50a500-e219-4a6b-8647-40e4ad9bc918,burningship +0ebfdc20-afff-4f43-8f4d-f8c5322c0534,burningship +de384a7f-7eda-49e4-a697-540ec1520d84,burningship +aa9bb433-5d6b-48ae-bae8-6d55a006094e,burningship +817526ca-b2d6-4c26-9574-32608ee23299,burningship +04ab639e-1dc8-4b73-a40d-c9201ad508c5,burningship +0eb3bb03-dfa5-437a-b5dc-1586c44e618f,burningship +6f73cef6-9ea3-4122-ad6e-28e6cc6fb855,burningship +000fcbb2-8c3c-419d-a4ae-ce2a1f9a70c9,burningship +74acc379-e640-4a94-b90e-8969c02148c4,burningship +e95b3178-31c3-4956-946b-f86ef949c615,burningship +3462c3b2-325a-4964-a323-aece6fb800f6,burningship +6f072a74-8eaa-48a5-a9b3-e20a342c4542,burningship +8f88a176-4cb5-41d4-b8d4-0742eacd3588,burningship +d6694286-77b5-4366-82ea-5a0aeeb7b274,burningship +43e5fbb3-305a-417b-a852-4c4b7c68e2fb,burningship +e0b155d7-75e3-47c9-acc4-daddc6fff687,burningship +9d59397f-64cd-4be7-8640-463670c816ed,burningship +3102aab7-57a1-4cde-92aa-bf752e3f4c1f,burningship +edc90676-518b-4e4c-a95a-4ef1cdf87822,burningship +f70bfb49-1f89-4b55-8641-e938c3cf17a4,burningship +222ad824-b0d0-4050-bcd2-9c3d83933bfb,burningship +66ad8099-1d44-44dc-8b4d-8cae8da07ecc,burningship +e222fa57-6511-4716-a734-70aa7c3c74ee,burningship +171908a3-e2b1-46c8-8f9f-af4ce4b056b1,burningship +5a914183-ce57-475c-b665-ba67eeb5ca28,burningship +02bfe57c-2baa-47a5-a0f8-f881efe2d72d,burningship +350bca01-8d79-4de2-b478-4289924f363c,burningship +4cb87483-6c57-4acc-89f4-8f26c83c7537,burningship +c1000901-0544-4163-bf11-c856626491e0,burningship +25d2385e-1517-4ac0-9450-a83a791aeadc,burningship +22d5b649-56df-4bb8-8a96-048ac251155a,burningship +b62a3131-5cd2-4267-8df2-3503d688e7dd,burningship +c530eb09-1d36-4598-8c74-1738a7627f19,burningship +e0913a47-f10a-4ef5-9af8-bf76be62fc9c,burningship +141a929e-50b3-4bf9-9a36-2ee01001f34e,burningship +9c53d0dd-e280-4da2-bc9d-ddb8b8830458,burningship +fbfab0c1-2204-4c5e-9b32-4b99f484b772,burningship +dc63e82b-0cb0-43d3-9f19-c0b301c95c09,burningship +ac125103-386e-4e5c-a904-45faf51e2744,burningship +665ab838-5dc6-4f37-b6ce-384f74dd314d,burningship +bd00486a-2eca-4838-946b-b0d9b4d838fa,burningship +8746481a-85a9-4845-9c86-c33d6c97c70d,burningship +cbd7f726-4375-4b05-840d-35546b87404d,burningship +6c62888f-5f42-4780-a2c4-74f698b6bcc0,burningship +4ed952ea-dfb3-4cd0-bc08-cb7ae6fe8d32,burningship +49fb5281-c971-49ac-a814-8a44eaefaeda,burningship +dbe40feb-03dc-45b2-9936-c64bad55ef7f,burningship +761196f8-b5e5-48f6-ae20-fba0af459837,burningship +a86402e5-7e6b-4baa-b321-43f12e7f3ee6,burningship +670c5941-32e5-4c14-9d00-58c3c0e4ca29,burningship +328dab3f-20f1-49b0-a77b-0aa65920526d,burningship +5f522173-27dd-44a2-a763-d99dc37af0ba,burningship +365ba4fb-4ab8-41e9-927e-48809447154d,burningship +2311381a-7bdf-4a77-b8f5-f895ab7ab285,burningship +a92fded1-15e8-48a8-a595-566f8c2d6bf8,burningship +a9ed73d0-74be-49ae-8cd8-4286fd76adfa,burningship +bddd5a6b-d4c9-42b4-a81e-af44e1dafb3e,sierpinski_gasket +93e5daea-4e8c-4c58-a197-b142b82b8bef,sierpinski_gasket +0659e479-f257-4518-ae2f-a04cb65526d2,sierpinski_gasket +8dc6161c-a42c-414f-8bcc-a72b92d1a331,sierpinski_gasket +23987b64-7746-427c-ad50-3c8ef41a7052,sierpinski_gasket +78253ed2-ef6c-411a-bf34-3d5c7dcf9234,sierpinski_gasket +2dd0d6d5-f820-4fd4-88ba-b98166907e1e,sierpinski_gasket +52ecc900-990d-4572-a9f5-dd9af7b0328b,sierpinski_gasket +4ed0d51f-fd71-4f7a-8c8d-89fc40d44fde,sierpinski_gasket +ca656d8a-41df-44ee-9b3b-a9abe3588f10,sierpinski_gasket +f33e6af5-ae2d-4300-a6be-64159b39f8f9,sierpinski_gasket +7c89dedd-5324-4664-aaeb-cd5e95faeb95,sierpinski_gasket +7eae8c16-d066-4539-9480-1aa84c35fe27,sierpinski_gasket +359af845-eb9b-4c4f-912c-9b14041caa22,sierpinski_gasket +6416bdd4-d346-4cce-92db-c6de6b9dd8a6,sierpinski_gasket +a5291f8a-0a8d-4018-9dfe-df0da778fa83,sierpinski_gasket +389ccdbb-4252-48c0-923a-3a1033a0b22e,sierpinski_gasket +bb1ca164-8538-4826-919c-e5adcea0a1de,sierpinski_gasket +d0a8fc52-6a8c-49df-9644-c393400ddb33,sierpinski_gasket +90ba7a24-f68b-432f-8039-d8c8109ef5b5,sierpinski_gasket +54f8938d-fde4-4183-bf02-6d738507e76b,sierpinski_gasket +217185e2-fdd3-46b3-b027-e22f02f21a1c,sierpinski_gasket +121451e9-ea7c-42b2-a85e-d7ba336daabe,sierpinski_gasket +7fc52e52-49b7-4c63-b8c1-36446942ef88,sierpinski_gasket +7dbec653-e894-45d9-b62d-83b6e96322ee,sierpinski_gasket +06aae3ee-f90c-4cef-8c42-6443832ed398,sierpinski_gasket +98d9d203-8808-4e7c-9c2c-974c043e332b,sierpinski_gasket +f8daa069-3e55-4fc2-9731-d780e1e7e5d6,sierpinski_gasket +d619dccb-1eba-4613-af5b-e552c6f44fef,sierpinski_gasket +9c3f2a2f-dd5d-4373-92b1-a140b6765e52,sierpinski_gasket +c8ddefc0-aca2-4013-8576-8d5ea7d6da04,sierpinski_gasket +766e81c9-a071-490b-aa86-d4599f820e2e,sierpinski_gasket +d1d6c2d3-8a4e-41db-814a-e81c93eac508,sierpinski_gasket +b3ff9ed2-d1ea-4ab8-8e86-5568c87ea97a,sierpinski_gasket +aaca0f48-ca1b-4d53-970b-42b98072b373,sierpinski_gasket +f331d563-f2d0-4a6c-838a-497e5756782c,sierpinski_gasket +56302c82-7377-4536-a2f7-596ce7ad3c01,sierpinski_gasket +178b9394-0f75-47cf-b832-274760bc049c,sierpinski_gasket +9948a554-e7cc-4059-95e2-26ea41f2fb79,sierpinski_gasket +ad1fa400-aedd-4b0d-8bd3-b40dad7ab91a,sierpinski_gasket +1baf70d1-a99f-441b-b40a-6a45d7252c78,sierpinski_gasket +8c001d36-5a6b-4dc0-bc5e-00a925ea59ff,sierpinski_gasket +36f28300-93ab-4f1a-bb7f-156c2439759a,sierpinski_gasket +9570bd0a-c864-4437-8962-7dc96eb32f79,sierpinski_gasket +774630e7-129a-4d57-901b-b4b23853336d,sierpinski_gasket +ffff2d64-f15d-4ef9-a80f-16a07c4473b7,sierpinski_gasket +41545155-c67c-4fe8-a0ec-a3c9c4c93c03,sierpinski_gasket +8a657d5d-dc30-4917-8ac5-fd62668f8946,sierpinski_gasket +7df71824-cd48-4601-b6e1-79040b451d8d,sierpinski_gasket +ce5bdd11-3a95-4106-9f24-c97aaa4339a3,sierpinski_gasket +00b2e735-694d-4396-a12b-3678c9646792,sierpinski_gasket +97529bc0-661a-47be-b572-ded716d790e5,sierpinski_gasket +d696d50a-74e0-4b09-a760-e33c85096a44,sierpinski_gasket +bbd81a78-131d-4c81-973b-cef23159afe8,sierpinski_gasket +9ec3386c-bf28-464f-b9ca-355781062bc1,sierpinski_gasket +6303f728-0c2e-483f-a3eb-736c8963a5d1,sierpinski_gasket +316e8d6a-5399-44d5-9c72-cd2d7073f3ff,sierpinski_gasket +7d31ed8f-d3ce-4702-b45b-0c43d20ebab7,sierpinski_gasket +b50ae033-24a3-4cc1-a4b1-318e75143248,sierpinski_gasket +8ca084d3-8f23-4bc9-861a-c688f170e9ca,sierpinski_gasket +0ae5fb83-42a3-47fa-b40d-5e748c31c88c,sierpinski_gasket +64c73cfc-2c2f-4817-adeb-8c8d3f68c484,sierpinski_gasket +56c8a44f-21d0-42e6-869b-ba0b0f9048a5,sierpinski_gasket +066df258-fc78-46f6-90d4-63ed19d06c83,sierpinski_gasket +feed4d73-8c90-422c-be51-c81e328b8be3,sierpinski_gasket +97014e3b-8e1f-495e-85ef-d119e6639169,sierpinski_gasket +5e7c14fe-720c-4072-bdbf-b3adddb83e88,sierpinski_gasket +f2689242-dc2c-4705-9f5e-2101a0c1f812,sierpinski_gasket +2d2bc776-9be2-4728-a2a2-b5cdce11330b,sierpinski_gasket +dfd6b6c9-7183-417b-ac8b-3acfda9353e5,sierpinski_gasket +ee942a00-75ee-48be-a682-f1703e2ffe68,sierpinski_gasket +4d7e2ed6-ec16-447e-b905-5a1cf871e1c8,sierpinski_gasket +1b2f76a3-ea29-4aa8-b068-650c3fdbc8f6,sierpinski_gasket +4495622c-1f74-4bba-865e-0ac0c68a74a6,sierpinski_gasket +7a111681-c44e-482d-a708-984bf494182a,sierpinski_gasket +17d37956-71c0-46ec-b06b-2791b99d8e21,sierpinski_gasket +8abc96f7-2e1a-498e-bcca-6b7ad6b45a47,sierpinski_gasket +7f484935-6d5f-4377-b973-60eceb6061de,sierpinski_gasket +872e03a9-6e70-418d-935b-2629a842eac7,sierpinski_gasket +c2caf305-95e3-4bac-95e5-f8880abf7305,sierpinski_gasket +150c5c96-c0c8-46e4-bba8-869cbf9c9326,sierpinski_gasket +a7870d22-7289-4d2c-acd7-3a4aadd136e6,sierpinski_gasket +cf497c3b-bb34-4737-a289-71217889f6f5,sierpinski_gasket +2a83a7e1-2b18-41e9-8951-3c1e6ce5ec42,sierpinski_gasket +9d92f99c-e680-4123-9325-c192a487c138,sierpinski_gasket +bb9c6a84-fb88-4cf7-bd5b-7228d6fcda30,sierpinski_gasket +054d9514-5e7a-48d9-a06a-fe67624c7f18,sierpinski_gasket +1bf77fc6-94fa-4cf8-8b32-8580c2501523,sierpinski_gasket +37eaeb5c-56b0-4bd3-9271-331ad37f95f1,sierpinski_gasket +a4b930be-14d1-4895-921f-deff1a238ffd,sierpinski_gasket +14106715-4774-44ca-b2e1-6a09d52fea90,sierpinski_gasket +06d8bfa8-3b9a-4640-9a8b-83b9a2e14963,sierpinski_gasket +50fb1fef-a7c0-4ba6-817b-52be97154ea5,sierpinski_gasket +9c668930-22bf-44c1-a26e-4d6b376f70cf,sierpinski_gasket +c477667b-633f-4a57-baa5-8cebc7abf493,sierpinski_gasket +8588d949-bb74-422e-999c-ae0adc2b96ba,sierpinski_gasket +8d2d829a-1a7f-434b-aebc-daa59cf07b8b,sierpinski_gasket +08b1ad2c-8d2c-4a12-806f-aacb07f9c22e,sierpinski_gasket +e484661b-a4de-4c02-be1f-7acb051f5e42,sierpinski_gasket +4d199db3-88f4-4e96-8841-a0f61711a3e9,sierpinski_gasket +3f3a6969-8983-4b0c-8f17-8d8aa3581c9b,newton +2d5a5c1d-3620-4b4a-a930-9453c8a99678,newton +9c73f641-2eb4-48b1-978d-9a9cd4df7c99,newton +9e4491f5-77c6-4822-a60a-d16edf3c42d8,newton +0b6fbcef-d176-435c-90cd-7e7f9430faec,newton +99b80ea6-85fb-4bac-9ff5-e8164745a1e0,newton +dfcf72a2-907a-4560-93b6-0b321f4e2263,newton +8ce888ba-2a3c-44e9-8742-139de8ae2aed,newton +9e3a06af-3484-4efa-81c6-536e655a3014,newton +185c203c-3c41-47a0-a066-00ba0808c432,newton +549991c0-93fa-43bf-8496-87a8ef150822,newton +9b610962-2f2d-48f9-be89-f46640332fe3,newton +2d382ab8-8541-461e-89d5-3ca7f2656eb7,newton +a8a9eed2-8170-4955-ad32-f8e6affc9d70,newton +77c72f80-15eb-40d7-a1c0-cb351dbbce6f,newton +fdd4dc6e-7b3c-49e0-9185-48f8f1dd7e6f,newton +8f725a04-36d9-404b-a94b-a462016c1f1f,newton +632d71a6-a98a-4203-a605-f27daa8b5bf0,newton +e5f2d79b-4a64-4498-a3a1-87fbb3873f47,newton +f96bc733-6bf9-4fc0-8504-fb7c3f2133b7,newton +d7828f78-7eb1-4a6a-8495-98272f21b4d7,newton +82a8aecb-d6d1-42ae-8c10-12b8322f53be,newton +025519b9-84cd-467e-ab96-a540c5c2815b,newton +68288502-1eb3-4fc2-9703-fca999ed810c,newton +d43aa286-7a10-4448-85f7-a066193952af,newton +5b022ecb-ea1b-43f5-8d04-6e7e2a02bca5,newton +18a7e861-eece-4d10-959d-2f98a0728408,newton +042ccf30-68da-4263-946d-b015a1fa7a69,newton +053b6141-00be-4d65-865a-46478c05b7ea,newton +06e33817-f04d-4653-8231-1d2a37c7a557,newton +22f17bbd-58af-481a-b56e-d1fe26a5ed86,newton +cdd67eb0-9f34-44d6-99a3-fdf5ae44dbf0,newton +f5b45eaa-8dc3-4e29-b111-66648cb85891,newton +f08a6588-1dfb-444b-8000-00461b36422e,newton +d9c23596-bbb4-4e8b-b7db-5a3e6f5a998f,newton +aa29d040-abdf-445f-b988-ae209d1fc8b6,newton +60667d46-33dc-4054-9d40-9cd68418503a,newton +7f24397e-4769-4ff8-830d-790ec4feeda6,newton +519f6d23-705c-47f6-92a3-049a53f0c488,newton +bb0427c6-339b-48a0-987e-6fc0ca5a8f8b,newton +b0cfd962-db6e-44f7-8ab6-623c6f41e6b9,newton +cb6ee1f9-db2d-4b47-a13e-bbcd5ab20fc7,newton +d408e174-eb16-43a4-b3f7-675ae0e3831d,newton +c4adc903-2b46-4cd6-b061-402bf5121542,newton +6ddb4333-94db-4708-b496-98137c3c503f,newton +0d613d07-24d2-45e2-8fa0-645b97284e2a,newton +390f38f7-443f-4cf6-b789-68e37176a310,newton +5d2202a4-4b15-414a-9b29-e676392ff2bd,newton +d552b720-8712-462a-a8ff-8fe1e595bef3,newton +57a89080-16cb-4cd8-91e7-7e072e7130b2,newton +3fff9a74-ede3-409f-971c-337dc280345d,newton +58ab0f88-44f9-475f-8092-49d1109dd53b,newton +cf6718e8-7eaf-49a8-afec-aebce6b75c49,newton +ebe939dc-cb00-4647-be80-97a9d32a5221,newton +dc180d3b-53a1-446a-8a2e-aca762a08cc9,newton +c46ffbb1-1844-4a17-a224-28fbe9c18f7d,newton +ff00ec62-8862-42af-a1fb-b0d582e9b822,newton +2fa8dd0a-4cf7-4842-8b5a-4af7c8695a75,newton +cd152cdc-c6e1-4ad3-9684-8bc0add33077,newton +fb317d5c-b964-420c-b199-701565e170e2,newton +0375737d-b08d-4298-a157-9a767297c77f,newton +51ffe12f-5989-4211-a048-ad7469378042,newton +7e2866c5-3727-4c64-8583-1d2576fb4b49,newton +8053a128-6d39-499e-a9eb-bfb69f652229,newton +fb50aa08-5156-467b-8699-34851749faef,newton +4a7903c1-14c3-45e5-8c43-39a807c0ca69,newton +d443f1f3-6590-438f-8064-8df69f8a9046,newton +36615030-3ae3-4c50-8c3e-037607487d52,newton +021c74a1-0799-4d5c-a2d1-e0511153d178,newton +6ec1ba63-b038-4753-b39e-3f63e7c1ae2b,newton +b46b43a1-39a3-41f9-95ca-de1751f815c2,newton +24315e2f-0926-4a13-8747-f19ebbe39223,newton +c7a3a65a-6568-4360-b1a8-a342855f8ead,newton +ba60622b-c20b-45ff-9898-bde23cd58ced,newton +0ec35b37-5986-4bbe-83de-586d3f4d6b55,newton +688a8946-409a-4129-ba71-fc54f89e63c5,newton +298e8077-5ae2-45f6-8583-656038ad69a8,newton +a3db4c14-d5ba-470c-bb4b-e0aa68c8253f,newton +7890fee0-92c5-41ec-b095-c771e2d84bf8,newton +eeefe620-71d9-4d12-aea2-b45c721d676b,newton +1aabf1d9-c71b-43b2-a98c-69301b35527e,newton +de0f25ac-2285-44d5-8e74-1de5b1ef69b3,newton +3af8ec5b-d34e-4665-a2bb-7fe9e188aa02,newton +d5f815eb-6312-433d-bb5d-34b40187c349,newton +7023523e-58cf-4c42-b4b7-3244a1d93e21,newton +b56398fe-08fa-40e3-b6ea-6676276e0f76,newton +c7574b2b-8796-4055-8d49-b8e10dc5239e,newton +777e9b1f-f160-48b7-a39b-9f63372d332e,newton +79f2dd6f-97de-4c34-a90d-2ea4dd5d9a56,newton +8b46a268-ec40-4db3-b824-3552ed86bb6b,newton +8d145241-dd91-4b57-b580-831436365e41,newton +3e89fe9b-7457-4740-b602-6a15f18bd27a,newton +cbfaab3f-4348-4ec9-a81f-104b95ab4353,newton +1abfcba0-f849-433b-a0cc-3f171f92dd76,newton +2c3a1412-6409-4133-9c40-b82681edc614,newton +ea3dbf33-92b9-40ce-84e5-a4a6f4cb8cc1,newton +d63c627a-cff3-4c19-9d14-a806d0908fc8,newton +2113f358-96d0-4ace-a717-f4e0cd6c4677,newton +bf02e534-8c78-4e2e-8983-91bd4255bf6a,newton +c034ed38-358a-445f-a5f6-0474d92b9959,newton From 3d94631cc372d93a038aef8449f5a2cf3245e769 Mon Sep 17 00:00:00 2001 From: Samuel Abramov Date: Tue, 9 Jan 2024 13:49:50 +0100 Subject: [PATCH 2/2] chore(): code cleanup --- .../io/MedianImputationBenchmark.java | 1 - .../imputation/MedianImputation.java | 13 +- .../ml/mlp/core/network/NeuralNetwork.java | 1 + .../ml/mlp/core/network/loader/Loader.java | 10 +- .../network/loader/csv/CSVDataLoader.java | 34 +- .../loader/fractality/FractalityLoader.java | 27 +- .../de/edux/ml/mlp/core/tensor/Matrix.java | 748 +++++++++--------- .../core/network/FractalityNetworkTest.java | 41 +- .../fractality/FractalityLoaderTest.java | 14 +- .../augmentation/small_test/class/images.csv | 600 ++++++++++++++ .../fractality/small_test/images.csv | 60 ++ .../fractality/small_train/images.csv | 301 +++++++ .../test/resources/fractality/test/images.csv | 121 --- .../resources/fractality/train/images.csv | 600 -------------- 14 files changed, 1399 insertions(+), 1172 deletions(-) create mode 100644 lib/src/test/resources/augmentation/small_test/class/images.csv create mode 100644 lib/src/test/resources/fractality/small_test/images.csv create mode 100644 lib/src/test/resources/fractality/small_train/images.csv delete mode 100644 lib/src/test/resources/fractality/test/images.csv delete mode 100644 lib/src/test/resources/fractality/train/images.csv diff --git a/lib/src/jmh/java/de/edux/benchmark/augmentation/io/MedianImputationBenchmark.java b/lib/src/jmh/java/de/edux/benchmark/augmentation/io/MedianImputationBenchmark.java index 5ff5bfd..8bc9927 100644 --- a/lib/src/jmh/java/de/edux/benchmark/augmentation/io/MedianImputationBenchmark.java +++ b/lib/src/jmh/java/de/edux/benchmark/augmentation/io/MedianImputationBenchmark.java @@ -52,7 +52,6 @@ public void readBatchOfImages() throws Exception { } } - // Erwarteter Median double[] numericValues = Arrays.stream(largeDataset) .filter(s -> !s.isBlank()) diff --git a/lib/src/main/java/de/edux/functions/imputation/MedianImputation.java b/lib/src/main/java/de/edux/functions/imputation/MedianImputation.java index 271c20d..4a5302e 100644 --- a/lib/src/main/java/de/edux/functions/imputation/MedianImputation.java +++ b/lib/src/main/java/de/edux/functions/imputation/MedianImputation.java @@ -44,12 +44,13 @@ private boolean isNumeric(String value) { return value.matches("-?\\d+(\\.\\d+)?") || value.isBlank(); } - double calculateMedian(String[] datasetColumn) { - double[] filteredDatasetColumnInNumbers = Arrays.stream(datasetColumn) - .filter(value -> !value.isBlank()) - .mapToDouble(Double::parseDouble) - .sorted() - .toArray(); + public double calculateMedian(String[] datasetColumn) { + double[] filteredDatasetColumnInNumbers = + Arrays.stream(datasetColumn) + .filter(value -> !value.isBlank()) + .mapToDouble(Double::parseDouble) + .sorted() + .toArray(); if (filteredDatasetColumnInNumbers.length % 2 == 0) { Double upper = filteredDatasetColumnInNumbers[filteredDatasetColumnInNumbers.length / 2]; Double lower = diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java b/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java index f45d14b..83dc0b8 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/NeuralNetwork.java @@ -125,6 +125,7 @@ private LinkedList> createBatchTasks(Loader loader, boolean train for (int i = 0; i < numberBatches; i++) { batches.add(executor.submit(() -> runBatch(loader, trainingMode))); } + loader.reset(); executor.shutdown(); diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/Loader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/Loader.java index ea30abd..14a4153 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/Loader.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/Loader.java @@ -1,11 +1,13 @@ package de.edux.ml.mlp.core.network.loader; public interface Loader { - MetaData open(); - void close(); + MetaData open(); - MetaData getMetaData(); - BatchData readBatch(); + void close(); + MetaData getMetaData(); + BatchData readBatch(); + + default void reset() {} } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/csv/CSVDataLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/csv/CSVDataLoader.java index 060632d..d838b4a 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/csv/CSVDataLoader.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/csv/CSVDataLoader.java @@ -3,30 +3,26 @@ import de.edux.ml.mlp.core.network.loader.BatchData; import de.edux.ml.mlp.core.network.loader.Loader; import de.edux.ml.mlp.core.network.loader.MetaData; - import java.io.File; public class CSVDataLoader implements Loader { - public CSVDataLoader(File csvFile, int batchSize) { - } - - @Override - public MetaData open() { - return null; - } + public CSVDataLoader(File csvFile, int batchSize) {} - @Override - public void close() { + @Override + public MetaData open() { + return null; + } - } + @Override + public void close() {} - @Override - public MetaData getMetaData() { - return null; - } + @Override + public MetaData getMetaData() { + return null; + } - @Override - public BatchData readBatch() { - return null; - } + @Override + public BatchData readBatch() { + return null; + } } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java index 0735da7..92ae2da 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoader.java @@ -3,7 +3,6 @@ import de.edux.ml.mlp.core.network.loader.BatchData; import de.edux.ml.mlp.core.network.loader.Loader; import de.edux.ml.mlp.core.network.loader.MetaData; -import de.edux.ml.mlp.core.network.loader.mnist.MnistMetaData; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -15,7 +14,6 @@ import java.util.Map; import java.util.stream.Stream; import javax.imageio.ImageIO; -import javax.imageio.stream.ImageInputStream; public class FractalityLoader implements Loader { @@ -26,8 +24,7 @@ public class FractalityLoader implements Loader { private final int imageWidth; private final int imageHeight; Iterator> csvContentIterator; - private ImageInputStream imageInputStream; - private MnistMetaData metaData; + private FractalityMetaData metaData; public FractalityLoader( String imageFolderPath, String csvLabelDataFile, int batchLength, int width, int height) { @@ -67,23 +64,18 @@ public MetaData open() { } private MetaData readMetaData() { - this.metaData = new MnistMetaData(); + this.metaData = new FractalityMetaData(); metaData.setNumberItems(csvContent.size()); metaData.setInputSize(imageWidth * imageHeight); metaData.setNumberOfClasses(6); metaData.setNumberBatches((int) Math.ceil(metaData.getNumberItems() / batchLength)); - metaData.setHeight(imageHeight); - metaData.setWidth(imageWidth); metaData.setBatchLength(batchLength); return metaData; } - - @Override public void close() { - this.metaData = null; } @@ -95,20 +87,25 @@ public MetaData getMetaData() { @Override public BatchData readBatch() { BatchData batchData = new FractalityBatchData(); - var totalItemsRead = metaData.getTotalItemsRead(); - var numberItems = metaData.getNumberItems(); int inputsRead = readInputBatch(batchData); + metaData.setItemsRead(inputsRead); return batchData; } + @Override + public void reset() { + csvContentIterator = csvContent.entrySet().iterator(); + } + private int readInputBatch(BatchData batchData) { var numberToRead = - Math.min(metaData.getBatchLength(), metaData.getInputSize()) - metaData.getTotalItemsRead(); + Math.min( + metaData.getBatchLength(), (metaData.getInputSize() - metaData.getTotalItemsRead())); + double[] dataInputs = new double[metaData.getInputSize() * metaData.getBatchLength()]; double[] dataExpected = new double[metaData.getNumberOfClasses() * metaData.getBatchLength()]; - for (int i = 0; i < numberToRead; i++) { if (csvContentIterator.hasNext()) { Map.Entry entry = csvContentIterator.next(); @@ -119,7 +116,6 @@ private int readInputBatch(BatchData batchData) { + File.separator + entry.getKey() + ".png"; - System.out.println(imagePath); try { BufferedImage image = ImageIO.read(new File(imagePath)); @@ -166,7 +162,6 @@ private double fractalityToDouble(String value) { } private double colorToDouble(Color color) { - // Konvertierung zu Graustufen und Normalisierung (Beispiel) return (color.getRed() + color.getGreen() + color.getBlue()) / 3.0 / 255.0; } diff --git a/lib/src/main/java/de/edux/ml/mlp/core/tensor/Matrix.java b/lib/src/main/java/de/edux/ml/mlp/core/tensor/Matrix.java index 265f52b..b7a3d1d 100644 --- a/lib/src/main/java/de/edux/ml/mlp/core/tensor/Matrix.java +++ b/lib/src/main/java/de/edux/ml/mlp/core/tensor/Matrix.java @@ -8,417 +8,413 @@ public class Matrix implements Serializable { - private static final String NUMBER_FORMAT = "%.3f"; - private double tolerance = 1e-5; - private final int rows; - private final int cols; - private double[] data; - - public Matrix multiplyParallel(double rate) { - Matrix result = new Matrix(this.rows, this.cols); - - IntStream.range(0, this.rows).parallel().forEach(i -> { - for (int j = 0; j < this.cols; j++) { + private static final String NUMBER_FORMAT = "%.3f"; + private final int rows; + private final int cols; + private double tolerance = 1e-5; + private double[] data; + + public Matrix(int rows, int cols) { + data = new double[rows * cols]; + this.rows = rows; + this.cols = cols; + } + + public Matrix(int rows, int cols, Producer producer) { + this(rows, cols); + for (int i = 0; i < data.length; i++) { + data[i] = producer.produce(i); + } + } + + public Matrix(int rows, int cols, double[] values) { + this.rows = rows; + this.cols = cols; + + Matrix temp = new Matrix(cols, rows); + temp.data = values; + Matrix transposed = temp.transpose(); + data = transposed.data; + } + + public Matrix(double[][] values) { + this.rows = values.length; + this.cols = values[0].length; + this.data = new double[rows * cols]; + for (int i = 0; i < rows; i++) { + System.arraycopy(values[i], 0, this.data, i * cols, cols); + } + } + + public Matrix multiplyParallel(double rate) { + Matrix result = new Matrix(this.rows, this.cols); + + IntStream.range(0, this.rows) + .parallel() + .forEach( + i -> { + for (int j = 0; j < this.cols; j++) { result.data[i * this.cols + j] = this.data[i * this.cols + j] * rate; - } - }); - - return result; - } - - public double sum() { - double sum = 0; - for (double datum : data) { - sum += datum; - } - return sum; - } - - public Matrix divide(int batches) { //TODO replace with apply - if (batches == 0) { - throw new IllegalArgumentException("Division durch null ist nicht erlaubt."); - } - - Matrix result = new Matrix(this.rows, this.cols); - for (int i = 0; i < this.data.length; i++) { - result.data[i] = this.data[i] / batches; - } - return result; - } - /** - * Subtracts the given matrix from this matrix. - *

- * This method performs an element-wise subtraction between two matrices. - * It requires that both matrices have the same dimensions. If the matrices - * do not have the same dimensions, an IllegalArgumentException is thrown. - *

- * - * @param matrix The matrix to be subtracted from this matrix. - * @return A new Matrix object representing the result of the subtraction. - * @throws IllegalArgumentException if the input matrix and this matrix do not have the same dimensions. - */ - public Matrix subtract(Matrix matrix) { - if (this.rows != matrix.rows || this.cols != matrix.cols) { - throw new IllegalArgumentException("Matrices must have the same size."); - } - - Matrix result = new Matrix(this.rows, this.cols); - for (int i = 0; i < this.data.length; i++) { - result.data[i] = this.data[i] - matrix.getData()[i]; - } - return result; - } - - public Matrix relu() { - return this.apply((index, value) -> Math.max(0, value)); - } - - public Matrix reluDerivative(Matrix input) { - return this.apply((index, value) -> input.get(index) > 0 ? value : 0); - } - - public void set(int row, int col, double value) { - data[row * cols + col] = value; - } - - public double get(int row, int col) { - return data[row * cols + col]; - } - - public Matrix addIncrement(int row, int col, double increment) { - Matrix result = apply((index, value) -> data[index]); - double originalValue = result.get(row, col); - double newValue = originalValue + increment; - result.set(row, col, newValue); - - return result; - } - - public Matrix transpose() { - Matrix result = new Matrix(cols, rows); - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - result.data[col * rows + row] = data[row * cols + col]; - } - } - return result; - } - - public Matrix transposeParallel() { - Matrix result = new Matrix(cols, rows); - - IntStream.range(0, rows).parallel().forEach(row -> { - for (int col = 0; col < cols; col++) { + } + }); + + return result; + } + + public double sum() { + double sum = 0; + for (double datum : data) { + sum += datum; + } + return sum; + } + + public Matrix divide(int batches) { // TODO replace with apply + if (batches == 0) { + throw new IllegalArgumentException("Division durch null ist nicht erlaubt."); + } + + Matrix result = new Matrix(this.rows, this.cols); + for (int i = 0; i < this.data.length; i++) { + result.data[i] = this.data[i] / batches; + } + return result; + } + + /** + * Subtracts the given matrix from this matrix. + * + *

This method performs an element-wise subtraction between two matrices. It requires that both + * matrices have the same dimensions. If the matrices do not have the same dimensions, an + * IllegalArgumentException is thrown. + * + * @param matrix The matrix to be subtracted from this matrix. + * @return A new Matrix object representing the result of the subtraction. + * @throws IllegalArgumentException if the input matrix and this matrix do not have the same + * dimensions. + */ + public Matrix subtract(Matrix matrix) { + if (this.rows != matrix.rows || this.cols != matrix.cols) { + throw new IllegalArgumentException("Matrices must have the same size."); + } + + Matrix result = new Matrix(this.rows, this.cols); + for (int i = 0; i < this.data.length; i++) { + result.data[i] = this.data[i] - matrix.getData()[i]; + } + return result; + } + + public Matrix relu() { + return this.apply((index, value) -> Math.max(0, value)); + } + + public Matrix reluDerivative(Matrix input) { + return this.apply((index, value) -> input.get(index) > 0 ? value : 0); + } + + public void set(int row, int col, double value) { + data[row * cols + col] = value; + } + + public double get(int row, int col) { + return data[row * cols + col]; + } + + public Matrix addIncrement(int row, int col, double increment) { + Matrix result = apply((index, value) -> data[index]); + double originalValue = result.get(row, col); + double newValue = originalValue + increment; + result.set(row, col, newValue); + + return result; + } + + public Matrix transpose() { + Matrix result = new Matrix(cols, rows); + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + result.data[col * rows + row] = data[row * cols + col]; + } + } + return result; + } + + public Matrix transposeParallel() { + Matrix result = new Matrix(cols, rows); + + IntStream.range(0, rows) + .parallel() + .forEach( + row -> { + for (int col = 0; col < cols; col++) { result.data[col * rows + row] = data[row * cols + col]; - } - }); - - return result; - } - - public double get(int index) { - return this.getData()[index]; - } - - public Matrix multiply(double rate) { - return this.apply((index, value) -> value * rate); - } + } + }); - public interface RowColumnProducer { - double produce(int row, int col, double value); - } - - public interface Producer { - double produce(int index); - } - - public interface IndexValueProducer { - double produce(int index, double value); - } - - public interface IndexValueConsumer { - void consume(int index, double value); - } + return result; + } - public interface RowColValueConsumer { - void consume(int row, int col, double value); - } + public double get(int index) { + return this.getData()[index]; + } + public Matrix multiply(double rate) { + return this.apply((index, value) -> value * rate); + } - public interface RowColIndexValueConsumer { - void consume(int row, int col, int index, double value); - } + public double[] getData() { + return data; + } - public double[] getData() { - return data; + public Matrix apply(IndexValueProducer function) { + Matrix result = new Matrix(rows, cols); + for (int i = 0; i < data.length; i++) { + result.data[i] = function.produce(i, data[i]); } + return result; + } - - - public Matrix(int rows, int cols) { - data = new double[rows * cols]; - this.rows = rows; - this.cols = cols; - } - - public Matrix(int rows, int cols, Producer producer) { - this(rows, cols); - for (int i = 0; i < data.length; i++) { - data[i] = producer.produce(i); - } + public Matrix multiply(Matrix other) { + if (cols != other.rows) { + throw new IllegalArgumentException("Matrix dimensions do not match"); } - - public Matrix(int rows, int cols, double[] values) { - this.rows = rows; - this.cols = cols; - - Matrix temp = new Matrix(cols, rows); - temp.data = values; - Matrix transposed = temp.transpose(); - data = transposed.data; - } - - public Matrix(double[][]values){ - this.rows = values.length; - this.cols = values[0].length; - this.data = new double[rows*cols]; - for(int i = 0; i < rows; i++){ - for(int j = 0; j < cols; j++){ - this.data[i*cols+j] = values[i][j]; - } - } - } - - public Matrix apply(IndexValueProducer function) { - Matrix result = new Matrix(rows, cols); - for (int i = 0; i < data.length; i++) { - result.data[i] = function.produce(i, data[i]); - } - return result; - } - - public Matrix multiply(Matrix other) { - if (cols != other.rows) { - throw new IllegalArgumentException("Matrix dimensions do not match"); + Matrix result = new Matrix(rows, other.cols); + for (int row = 0; row < rows; row++) { + for (int col = 0; col < other.cols; col++) { + double sum = 0; + for (int i = 0; i < cols; i++) { + sum += data[row * cols + i] * other.data[i * other.cols + col]; } - Matrix result = new Matrix(rows, other.cols); - for (int row = 0; row < rows; row++) { - for (int col = 0; col < other.cols; col++) { + result.data[row * other.cols + col] = sum; + } + } + return result; + } + + public Matrix multiplyParallel(Matrix other) { + if (cols != other.rows) { + throw new IllegalArgumentException("Matrix dimensions do not match"); + } + Matrix result = new Matrix(rows, other.cols); + IntStream.range(0, rows) + .parallel() + .forEach( + row -> { + for (int col = 0; col < other.cols; col++) { double sum = 0; for (int i = 0; i < cols; i++) { - sum += data[row * cols + i] * other.data[i * other.cols + col]; + sum += data[row * cols + i] * other.data[i * other.cols + col]; } result.data[row * other.cols + col] = sum; - } + } + }); + + return result; + } + + public Matrix averageColumn() { + Matrix result = new Matrix(rows, 1); + forEach((row, col, value) -> result.data[row] += value / cols); + return result; + } + + public Matrix add(Matrix other) { + // Überprüfen, ob die andere Matrix eine Spaltenmatrix ist, die als Bias verwendet werden kann + if (this.cols != other.cols && other.cols != 1) { + throw new IllegalArgumentException( + "Für die Addition muss die zweite Matrix entweder dieselbe Größe haben oder eine Spaltenmatrix sein."); + } + + Matrix result = new Matrix(rows, cols); + for (int row = 0; row < this.rows; row++) { + for (int col = 0; col < this.cols; col++) { + if (other.cols == 1) { + // Addiere den Bias, wenn die zweite Matrix eine Spaltenmatrix ist + result.data[row * cols + col] = this.data[row * cols + col] + other.data[row]; + } else { + // Normale elementweise Addition, wenn die zweite Matrix dieselbe Größe hat + result.data[row * cols + col] = + this.data[row * cols + col] + other.data[row * cols + col]; } - return result; + } } - public Matrix multiplyParallel(Matrix other) { - if (cols != other.rows) { - throw new IllegalArgumentException("Matrix dimensions do not match"); - } - Matrix result = new Matrix(rows, other.cols); - IntStream.range(0, rows) - .parallel() - .forEach( - row -> { - for (int col = 0; col < other.cols; col++) { - double sum = 0; - for (int i = 0; i < cols; i++) { - sum += data[row * cols + i] * other.data[i * other.cols + col]; - } - result.data[row * other.cols + col] = sum; - } - }); - - return result; - } + return result; + } - public Matrix averageColumn() { - Matrix result = new Matrix(rows, 1); - forEach((row, col, value) -> { - result.data[row] += value / cols; - }); - return result; + public Matrix modify(RowColumnProducer function) { + int index = 0; + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++, index++) { + data[index] = function.produce(row, col, data[index]); + } } + return this; + } - public Matrix add(Matrix other) { - // Überprüfen, ob die andere Matrix eine Spaltenmatrix ist, die als Bias verwendet werden kann - if (this.cols != other.cols && other.cols != 1) { - throw new IllegalArgumentException( - "Für die Addition muss die zweite Matrix entweder dieselbe Größe haben oder eine Spaltenmatrix sein."); - } - - Matrix result = new Matrix(rows, cols); - for (int row = 0; row < this.rows; row++) { - for (int col = 0; col < this.cols; col++) { - if (other.cols == 1) { - // Addiere den Bias, wenn die zweite Matrix eine Spaltenmatrix ist - result.data[row * cols + col] = this.data[row * cols + col] + other.data[row]; - } else { - // Normale elementweise Addition, wenn die zweite Matrix dieselbe Größe hat - result.data[row * cols + col] = - this.data[row * cols + col] + other.data[row * cols + col]; - } - } - } - - return result; + public void forEach(IndexValueConsumer consumer) { + for (int i = 0; i < data.length; i++) { + consumer.consume(i, data[i]); } + } - public Matrix modify(RowColumnProducer function) { - int index = 0; - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++, index++) { - data[index] = function.produce(row, col, data[index]); - } - } - return this; + public void forEach(RowColIndexValueConsumer consumer) { + int index = 0; + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + consumer.consume(row, col, index, data[index++]); + } } + } - public void forEach(IndexValueConsumer consumer) { - for (int i = 0; i < data.length; i++) { - consumer.consume(i, data[i]); - } + public void forEach(RowColValueConsumer consumer) { + int index = 0; + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + consumer.consume(row, col, data[index++]); + } } + } - public void forEach(RowColIndexValueConsumer consumer) { - int index = 0; - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - consumer.consume(row, col, index, data[index++]); - } - } - } + public void setTolerance(double tolerance) { + this.tolerance = tolerance; + } - public void forEach(RowColValueConsumer consumer) { - int index = 0; - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - consumer.consume(row, col, data[index++]); - } - } + public Matrix sumColumns() { + Matrix result = new Matrix(1, cols); + int index = 0; + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + result.data[col] += data[index++]; + } } - public void setTolerance(double tolerance) { - this.tolerance = tolerance; - } + return result; + } - public Matrix sumColumns() { - Matrix result = new Matrix(1, cols); - int index = 0; - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - result.data[col] += data[index++]; - } - } + public Matrix softmax() { + Matrix result = new Matrix(rows, cols, i -> Math.exp(data[i])); + Matrix colSum = result.sumColumns(); - return result; - } - - public Matrix softmax() { - Matrix result = new Matrix(rows, cols, i -> Math.exp(data[i])); - Matrix colSum = result.sumColumns(); + result.modify((row, col, value) -> value / colSum.getData()[col]); + return result; + } - result.modify((row, col, value) -> { - return value / colSum.getData()[col]; - }); - return result; + public Matrix getGreatestRowNumber() { + Matrix result = new Matrix(1, cols); + double[] greatest = new double[cols]; + for (int i = 0; i < cols; i++) { + greatest[i] = Double.MIN_VALUE; } - public Matrix getGreatestRowNumber() { - Matrix result = new Matrix(1, cols); - double[] greatest = new double[cols]; - for (int i = 0; i < cols; i++) { - greatest[i] = Double.MIN_VALUE; - } - - forEach((row, col, value) -> { - if (value > greatest[col]) { - greatest[col] = value; - result.data[col] = row; - } + forEach( + (row, col, value) -> { + if (value > greatest[col]) { + greatest[col] = value; + result.data[col] = row; + } }); - return result; - } - - public int getRows() { - return rows; - } - - public int getCols() { - return cols; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Matrix matrix = (Matrix) o; - - for (int i = 0; i < data.length; i++) { - if (Math.abs(data[i] - matrix.data[i]) > tolerance) { - return false; - } + return result; + } + + public int getRows() { + return rows; + } + + public int getCols() { + return cols; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Matrix matrix = (Matrix) o; + + for (int i = 0; i < data.length; i++) { + if (Math.abs(data[i] - matrix.data[i]) > tolerance) { + return false; + } + } + return true; + } + + @Override + public int hashCode() { + int result = Objects.hash(rows, cols); + result = 31 * result + Arrays.hashCode(data); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + // Berechnen der maximalen Breite jeder Spalte + int[] maxWidth = new int[cols]; + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + int length = String.format(NUMBER_FORMAT, data[row * cols + col]).length(); + if (length > maxWidth[col]) { + maxWidth[col] = length; } - return true; - } - - @Override - public int hashCode() { - int result = Objects.hash(rows, cols); - result = 31 * result + Arrays.hashCode(data); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - // Berechnen der maximalen Breite jeder Spalte - int[] maxWidth = new int[cols]; - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - int length = String.format(NUMBER_FORMAT, data[row * cols + col]).length(); - if (length > maxWidth[col]) { - maxWidth[col] = length; - } - } - } - - // Hinzufügen der Rahmenlinien und der Daten - String rowSeparator = - "+" - + Arrays.stream(maxWidth) - .mapToObj(width -> "-".repeat(width + 2)) - .collect(Collectors.joining("+")) - + "+\n"; - - for (int row = 0; row < rows; row++) { - sb.append(rowSeparator); - sb.append("|"); - for (int col = 0; col < cols; col++) { - String formattedNumber = - String.format( - "%" + maxWidth[col] + "s", String.format(NUMBER_FORMAT, data[row * cols + col])); - sb.append(" ").append(formattedNumber).append(" |"); - } - sb.append("\n"); - } - sb.append(rowSeparator); - - return sb.toString(); - } - - public String toString(boolean showValues) { - if (showValues) { - return toString(); - } else { - return "{" + - "rows=" + rows + - ", cols=" + cols + - '}'; - } - } + } + } + + // Hinzufügen der Rahmenlinien und der Daten + String rowSeparator = + "+" + + Arrays.stream(maxWidth) + .mapToObj(width -> "-".repeat(width + 2)) + .collect(Collectors.joining("+")) + + "+\n"; + + for (int row = 0; row < rows; row++) { + sb.append(rowSeparator); + sb.append("|"); + for (int col = 0; col < cols; col++) { + String formattedNumber = + String.format( + "%" + maxWidth[col] + "s", String.format(NUMBER_FORMAT, data[row * cols + col])); + sb.append(" ").append(formattedNumber).append(" |"); + } + sb.append("\n"); + } + sb.append(rowSeparator); + + return sb.toString(); + } + + public String toString(boolean showValues) { + if (showValues) { + return toString(); + } else { + return "{" + "rows=" + rows + ", cols=" + cols + '}'; + } + } + + public interface RowColumnProducer { + double produce(int row, int col, double value); + } + + public interface Producer { + double produce(int index); + } + + public interface IndexValueProducer { + double produce(int index, double value); + } + + public interface IndexValueConsumer { + void consume(int index, double value); + } + + public interface RowColValueConsumer { + void consume(int row, int col, double value); + } + + public interface RowColIndexValueConsumer { + void consume(int row, int col, int index, double value); + } } diff --git a/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java b/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java index fb13fb5..9ef082d 100644 --- a/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java +++ b/lib/src/test/java/de/edux/core/network/FractalityNetworkTest.java @@ -5,6 +5,7 @@ import de.edux.ml.mlp.core.network.layers.DenseLayer; import de.edux.ml.mlp.core.network.layers.ReLuLayer; import de.edux.ml.mlp.core.network.layers.SoftmaxLayer; +import de.edux.ml.mlp.core.network.loader.Loader; import de.edux.ml.mlp.core.network.loader.MetaData; import de.edux.ml.mlp.core.network.loader.fractality.FractalityLoader; import org.junit.jupiter.api.BeforeAll; @@ -12,35 +13,35 @@ public class FractalityNetworkTest { - private static FractalityLoader fractalityTrainLoader; - private static FractalityLoader fractalityTestLoader; + private static Loader fractalityTrainLoader; + private static Loader fractalityTestLoader; @BeforeAll static void setUp() { fractalityTrainLoader = new FractalityLoader( - "src/test/resources/fractality/train/class", - "src/test/resources/fractality/train/images.csv", - 5, - 256, - 256); + "src/test/resources/fractality/small_train/class", + "src/test/resources/fractality/small_train/images.csv", + 100, + 64, + 64); fractalityTestLoader = new FractalityLoader( - "src/test/resources/fractality/test/class", - "src/test/resources/fractality/test/images.csv", - 5, - 256, - 256); + "src/test/resources/fractality/small_test/class", + "src/test/resources/fractality/small_test/images.csv", + 10, + 64, + 64); } @Test public void shouldTrain() { - int batchSize = 5; + int batchSize = 100; ExecutionMode singleThread = ExecutionMode.SINGLE_THREAD; - int epochs = 5; - float initialLearningRate = 0.1f; - float finalLearningRate = 0.001f; + int epochs = 100; + float initialLearningRate = 0.01f; + float finalLearningRate = 0.0001f; MetaData trainMetaData = fractalityTrainLoader.open(); int inputSize = trainMetaData.getInputSize(); @@ -49,13 +50,9 @@ public void shouldTrain() { // Training from scratch new NetworkBuilder() - .addLayer(new DenseLayer(inputSize, 256)) + .addLayer(new DenseLayer(inputSize, 32)) .addLayer(new ReLuLayer()) - .addLayer(new DenseLayer(256, 256)) - .addLayer(new ReLuLayer()) - .addLayer(new DenseLayer(256, 256)) - .addLayer(new ReLuLayer()) - .addLayer(new DenseLayer(256, outputSize)) + .addLayer(new DenseLayer(32, outputSize)) .addLayer(new SoftmaxLayer()) .withBatchSize(batchSize) .withLearningRates(initialLearningRate, finalLearningRate) diff --git a/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java b/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java index 68400af..6c60ec2 100644 --- a/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java +++ b/lib/src/test/java/de/edux/ml/mlp/core/network/loader/fractality/FractalityLoaderTest.java @@ -14,26 +14,26 @@ class FractalityLoaderTest { static void setUp() { fractalityLoader = new FractalityLoader( - "src/test/resources/fractality/test/class", - "src/test/resources/fractality/test/images.csv", + "src/test/resources/fractality/small_test/class", + "src/test/resources/fractality/small_test/images.csv", 5, - 256, - 256); + 64, + 64); } @Test void shouldLoadCSVContent() { - assertEquals(120, fractalityLoader.getCsvContent().size()); + assertEquals(59, fractalityLoader.getCsvContent().size()); assertTrue(fractalityLoader.getCsvContent().values().stream().allMatch(s -> s != null)); } @Test void shouldReadMetaData() { MetaData metaData = fractalityLoader.open(); - assertEquals(120, metaData.getNumberItems()); + assertEquals(59, metaData.getNumberItems()); assertNotNull(fractalityLoader.getMetaData()); assertEquals(6, metaData.getNumberOfClasses()); - assertEquals(24, metaData.getNumberBatches()); + assertEquals(11, metaData.getNumberBatches()); assertEquals(0, metaData.getTotalItemsRead()); assertEquals(5, metaData.getBatchLength()); } diff --git a/lib/src/test/resources/augmentation/small_test/class/images.csv b/lib/src/test/resources/augmentation/small_test/class/images.csv new file mode 100644 index 0000000..acb984c --- /dev/null +++ b/lib/src/test/resources/augmentation/small_test/class/images.csv @@ -0,0 +1,600 @@ +image,label +ff0b5fee-0555-4789-b987-24532a66a572,tricorn +95604640-8736-47ba-8550-1fc568dadd53,tricorn +36d69556-52b0-4b09-96d1-e60cf1ad9f6d,tricorn +125a4a59-507d-4ea7-b26c-cb868e69d187,tricorn +360d3972-05c9-4c23-9767-562216b40ed5,tricorn +eef126c8-e093-44a0-8b40-c9058bf0bbc6,tricorn +b3e0b303-a64a-402b-a02a-d93a891374ca,tricorn +decf9ddf-b85d-4f7b-a931-c0a4df1f74af,tricorn +944be4c6-a109-406e-a7ae-c4e9ffc28429,tricorn +75b55cdb-fece-4af3-bf9f-16dc00a1061e,tricorn +a2fffcbd-a032-4af1-82d4-7ce9406a27c2,tricorn +5d6179b3-2924-42d4-a553-5a6a039fa8c6,tricorn +59d3b86b-aeaf-4039-a058-a731697fa586,tricorn +1759e614-b8c9-40b7-b0af-948c0461ee39,tricorn +0d40de1c-45bb-4d77-ba17-fdbd74e8365b,tricorn +5cdf6e99-5308-4924-9b90-d21473ff6c2b,tricorn +5bf93b4c-7aef-4d23-9369-68b45b3cab9e,tricorn +f70ae41d-8e5e-437f-ac4a-ba8d37401dcb,tricorn +fb6320ae-9676-4f5d-8137-087c9a20044d,tricorn +dea6d55f-d532-4f06-ba60-128f01e5f1df,tricorn +64d31662-22de-4cee-a5bc-e7104997766f,tricorn +7fa300d9-2282-4567-93d1-7052cd8ae36c,tricorn +f8176892-6893-4c3c-a636-bbf9b3ef5191,tricorn +807eddc5-7bbc-4d1c-bfac-04b8f2f19327,tricorn +db43dae3-92e1-4129-bd62-06025f34966a,tricorn +bbebc761-5ac4-4415-a1a2-fbe7c70e3cdb,tricorn +3d0b120f-82ae-4b74-b86c-e5d57c37d641,tricorn +75c813a5-3bd8-4a8e-803f-635eb97c8263,tricorn +a1421f61-3691-446b-9da8-37f168c88748,tricorn +1b238db1-700c-41e1-a1ac-90c6f512ff51,tricorn +71dcd0ca-0747-414b-955e-f2f02f7d28cf,tricorn +4eb80a73-da84-40b1-8a98-46fcf56b7bdf,tricorn +9e67332b-1586-47e4-9984-474aae4b8b29,tricorn +b3181b73-cebd-44a2-aab5-25ebd92faf72,tricorn +54f5e7a4-d0f9-4b06-ae63-608452ba2513,tricorn +cb571299-d91a-4ad5-bbf2-f89e25dbbd6c,tricorn +278c4812-0e21-4a7c-8c78-de83b278a609,tricorn +ba6c489b-6af1-4f97-b768-5f420bab1405,tricorn +f3a0a009-0052-4017-8a7e-7a9563aea84c,tricorn +4fa1bf0c-b8f0-4774-8b5c-d2fe91ce1f2a,tricorn +82c87995-8a3e-4dc9-a1b9-90ed9a86a003,tricorn +23aaacdc-1887-449d-bd8a-40737590317c,tricorn +198b3958-0107-4fb0-96ec-58abb166bce4,tricorn +0dc6cfc8-f18b-4704-a730-f22cbf755318,tricorn +e8cc2389-d514-497c-b5c6-03e452bd8ad1,tricorn +d2c1a76c-a529-48b8-8165-b3500ecbdbcc,tricorn +8106c79b-ea2d-4f97-b2f4-f6f6567b7be1,tricorn +5983a4bb-e2e7-4798-adb3-8b48ac1cf8b2,tricorn +35242ddb-7c0c-4c1e-96d7-5389332d6bee,tricorn +403858cc-45fe-4fc6-9213-e54c49585fdc,tricorn +3729240a-b05a-4c42-9800-f2816d32beed,tricorn +1668b67c-de7d-45aa-8adb-91d6e4bbb441,tricorn +ff8b0913-fa47-48cd-94b0-3e5193efc799,tricorn +f08701ad-322d-4469-8afa-481b272869d5,tricorn +57af983c-8d28-4bab-a951-b253a76ad629,tricorn +70fd325e-af25-433f-bc02-a1d73901a74a,tricorn +56b6fe41-4db8-48f0-bb32-5fb143dbc1b3,tricorn +4ccbebfc-1be0-4ff8-b26c-ef24b5c76941,tricorn +0f0fbec0-725d-4780-b057-37872626b501,tricorn +e8a801ac-04b7-403d-96ef-0a63ac7a51d0,tricorn +fa6ce004-bca2-4b75-8d1a-bf65dbf1841f,tricorn +73e07f91-c23c-4071-8dd3-a0fca26ed1ec,tricorn +3b9e3d8f-aa48-4cd3-b453-91dab36ffd7d,tricorn +bb86c57b-2621-4d82-86c4-dac79358a244,tricorn +62ed3c7c-2227-48fa-a4ee-f6ee6394aa50,tricorn +ed12d736-ad70-48c7-b07a-56fd3eccac33,tricorn +aa90fae9-3ce8-44ad-a04a-099c9c3e94e8,tricorn +205eb1ae-afb3-4381-8f99-643dc890cb50,tricorn +c76c9f2e-6fae-4146-a16c-0e512432ef7e,tricorn +98fc8379-fdc5-41a4-a3da-09156337b30e,tricorn +c480690e-19ac-4662-ad7f-f7a5808a5545,tricorn +0101cc2f-899c-4161-9be1-8c0c77bb6909,tricorn +3572131d-b805-494b-add7-0ea5d0e5e567,tricorn +f5f0d1e2-4154-4a3c-876d-12074eb1bac0,tricorn +4103a780-2d15-487e-9ec2-a523d50bf5eb,tricorn +f769c143-852b-45c5-b8d4-8e5f936baa3a,tricorn +6375e0f2-4510-4ac4-821e-1eb0d2ec074f,tricorn +d7e40a84-e48b-415a-aef9-4c8814ed42ed,tricorn +f1c8abc1-2549-4324-879b-cde5b22124f7,tricorn +04e385cb-010e-4b2c-8bfe-4f41bf87af9b,tricorn +9f5cefe8-26f0-402e-bc9b-a92249fa7447,tricorn +b4df98d6-cc50-4c11-8aa1-6e28b020205f,tricorn +52b57607-2ec4-43a5-8ab2-1ad9d73e9201,tricorn +5155988b-ba81-4c1b-a1ba-c40ab76760fb,tricorn +b480e918-870c-48ec-8989-1265716bfddd,tricorn +1ba95a45-52c8-4a82-88f2-e868b87ef0ad,tricorn +67d6baec-dbb5-42a1-a3e6-3a1e5235ece8,tricorn +e7331b2a-4c9b-42cf-a891-c08648e7785b,tricorn +699c6f2f-0341-4022-a6a3-3906cbb9ac5e,tricorn +7a1d47a4-32a7-4f2f-b0da-0c273a2fc819,tricorn +a7600f70-746f-4eb7-9283-83af0a8e5dc6,tricorn +c900f308-4033-424d-a647-06864fcc5c0e,tricorn +0c24b295-92eb-4e65-bc3e-b9d6383dd7ff,tricorn +813ee03a-6dae-43a7-ab13-8387ffc6bb6b,tricorn +9347a1fb-c393-4597-8ed1-d2ff79172370,tricorn +cc32a34d-77b3-489d-996a-50088e771fc4,tricorn +56ebef96-30ce-48d5-80cd-aad76db1e1f2,tricorn +3de91e43-f462-4459-b805-300fbff27bf6,tricorn +ad427b93-feca-4397-9ced-a02faf040111,tricorn +30636fce-6c40-4931-8ae2-00c5947a22db,tricorn +8a56e0fd-f92e-4aba-9932-b2497ee80ea0,mandelbrot +2d848615-8ee8-4ac3-88cf-802a68ebd5ff,mandelbrot +60fa78db-a2ea-48ee-8a92-0748eeb0ae99,mandelbrot +92675f50-223a-4848-862c-8fef29b7824d,mandelbrot +126478b3-f75d-4bba-a723-9ecc593fc24e,mandelbrot +09268b13-dc44-469e-ae7b-c0716feb77aa,mandelbrot +7f84ce62-f07c-4a73-9e8d-9952ddec6a2e,mandelbrot +b06dd919-836f-44e3-a76d-40ec9c3a1b05,mandelbrot +c3ef3682-f368-4057-b201-3778db729274,mandelbrot +134a7c3b-f44a-464f-a60b-60a7d18be3f2,mandelbrot +0ab8b267-a260-4ce4-a10a-e8fbde80b224,mandelbrot +85dfeeb0-e40a-431f-adf6-8ba0e7330642,mandelbrot +8dbb63e2-f6c3-43cc-9dc9-d63c902f89d7,mandelbrot +7dd773c5-0ff1-427e-a02e-b0f7ab85b8a3,mandelbrot +efa30cb7-9433-4dd0-b448-af58d0652f3e,mandelbrot +f42dc4ac-0f7f-472f-90d4-1b8d7db17ec3,mandelbrot +80d40837-56b6-4565-aa44-df507fd32511,mandelbrot +610d1d75-6e98-44b8-99da-94dab2ae1f71,mandelbrot +638e9efd-3deb-40a6-b09e-c8d769b25ceb,mandelbrot +42c6d39f-3b81-4413-ae1a-8abf917987e2,mandelbrot +422516e3-1c5e-4b86-9d04-35b6690c048b,mandelbrot +ee85650a-f3d6-4816-8331-c3e1a8342bac,mandelbrot +aa1c401a-7c99-4991-9ee5-c9e01e57464a,mandelbrot +00a66d89-f948-4a5d-92f4-799cc272a3be,mandelbrot +75d1d7a7-4fd8-40eb-87bb-157543791bfd,mandelbrot +8cccda71-6896-43c9-a470-4f72c4594f90,mandelbrot +6c481488-ce91-45e0-88ba-72fba895a57c,mandelbrot +8ed687fb-cf93-4be4-8258-aca3abd9e29b,mandelbrot +19c748b9-c600-420e-8d10-50887c0c0ad8,mandelbrot +21c57162-7d91-4a75-8186-1435076c2bdc,mandelbrot +bc605ca1-c4a3-4359-b235-e74ab5983acc,mandelbrot +75a3c8f1-0e6f-4b8a-8072-f3a098d1ef45,mandelbrot +3320dd41-b897-4e32-82dd-29c996e195f1,mandelbrot +982506de-bd81-4697-b6f5-80c5c8169fdf,mandelbrot +85a6a3e9-eff6-4466-97d4-a34a3481cb0c,mandelbrot +85450911-3b52-4e9e-b0a6-f6de4ce973a6,mandelbrot +463ee5e0-4f50-4c05-82f1-9d608c35512e,mandelbrot +dc0e756a-b2d2-4684-8dc1-c3dd0b3794a4,mandelbrot +d799c462-50ba-485e-9727-fc50e37709d2,mandelbrot +43302162-ee88-4de3-bf6b-b998b3f51968,mandelbrot +4cbdbc81-0351-4021-ba17-50fd6ba930fc,mandelbrot +2b4e76e9-1a4a-461f-84ef-39c9bcd63f34,mandelbrot +3b67c796-632b-4d69-abd8-026dca0e4275,mandelbrot +0b61c06b-9d28-49f1-8e87-0b165fc374b2,mandelbrot +e2bd5305-da01-4451-8a3f-7828f5b57d0a,mandelbrot +65d7f35f-561c-4d05-aa36-e761ff24d5ef,mandelbrot +6f19adcf-012d-4b80-9937-305f76fd1d0a,mandelbrot +dae53598-68af-4f2f-b1fc-9fd5884faa01,mandelbrot +df3ed3e1-cada-44fb-bd73-6234e47a313e,mandelbrot +d9b815d8-0517-4ea2-a4b2-9ca6e61f962d,mandelbrot +61064a52-9fe3-4b5b-81c4-fbab380187bb,mandelbrot +e6bd351e-d360-49bc-b448-c398cff46067,mandelbrot +e0f16f8d-0b4d-488f-a3fa-8532274d0f7c,mandelbrot +df9cb93d-385e-461e-b316-52d917ffd259,mandelbrot +cb9ca0d3-7f8f-4b2b-a353-6eca40f1b388,mandelbrot +c0458583-278e-4135-b077-18983e74e3a8,mandelbrot +5eb37e53-c42c-493c-8923-d00779c2b986,mandelbrot +c396e86e-0d09-4b3e-b103-97fcfcbf603b,mandelbrot +f2689953-3c42-4fe0-8f6f-15048a96e06b,mandelbrot +682f35aa-1289-44e5-a93a-0b78b63942a3,mandelbrot +0d18279b-69dc-45aa-8848-ba5424589b32,mandelbrot +dedc4c03-c98f-4158-9773-d5644d4e48ae,mandelbrot +909c3b66-ad81-4fa5-8b7b-59a68f4409ab,mandelbrot +82f57c89-d93f-4e62-9812-647b2d9ab9fe,mandelbrot +b64ff3c6-15c0-4a58-ba39-1f37ea2dc3a8,mandelbrot +1ce5208b-cba6-43a0-8036-21dcd8cdce5b,mandelbrot +d8b654ea-c92c-4688-8709-4329bd60fb21,mandelbrot +8097546c-b503-4060-beab-1e8e05660911,mandelbrot +7c63cedb-ac68-43d7-a286-935d6c072c88,mandelbrot +7860c88f-8944-4692-9ae6-8da668f48deb,mandelbrot +badd4f43-bc73-4f3b-ab9b-0ed41fe8e746,mandelbrot +51f491b7-2cd0-4b65-845c-e693faa7749f,mandelbrot +d0666cef-1758-440e-8af2-3a81c96d57eb,mandelbrot +a98fdb38-2f51-40e8-b907-70e701ec4c50,mandelbrot +8b31e76c-1b6b-4fad-b7ab-40ed56ecc609,mandelbrot +0cef6fcb-c65e-40c0-b3a7-6cee81dca6c1,mandelbrot +e40603f7-2ec3-41a1-adb2-fd8f55364b9f,mandelbrot +e511cff3-9f00-40f6-8900-8558b8ebbff9,mandelbrot +df3eb5b7-afe8-4e93-9413-ccda968aa976,mandelbrot +8806d78e-f7ef-4efc-a442-0f689134f1a3,mandelbrot +2f97a4d5-b903-4d20-9172-05da25a1ebb6,mandelbrot +0b92df16-a640-4f6a-9d17-117f2a102a5d,mandelbrot +4727d638-512a-4c83-a518-22dc0510c3ef,mandelbrot +fc95744b-e6e2-49fd-b356-4bdf3d932f18,mandelbrot +4b69461a-d065-4b20-9f9f-b6993b5f53fc,mandelbrot +9ad28e9d-1547-428b-8cf6-15480dcc65d0,mandelbrot +6401bf9c-596a-4c3d-b49f-885fb6f6bf3e,mandelbrot +11f9d101-b51d-44c5-a343-063db92db975,mandelbrot +fe2b0981-e76b-41a9-b99b-a357ad0b4b18,mandelbrot +9712c763-4168-4e66-ba6a-d950ff403b7b,mandelbrot +a504cda4-7bd9-4bfe-af6f-13bc3ea8a8dc,mandelbrot +876288b4-77b0-458c-ab3a-35fb6ecbb3ca,mandelbrot +0edc7a97-af43-4b6a-a832-15a789283676,mandelbrot +dd405ff7-e08a-45d4-8171-1384e683e966,mandelbrot +57d28a9c-22c1-4edc-b22e-70c9b04d6c0c,mandelbrot +5832e0b1-8fa2-4192-8d73-4643daeedef3,mandelbrot +ebe90302-7def-4f6a-b2b6-06a3c683a0b3,mandelbrot +fee0d83b-ff0a-49d4-b899-032c204c94f8,mandelbrot +7403b834-fbff-4140-845c-2ab667d2f738,mandelbrot +56953bcc-b238-47fa-8ad7-3a0d28ae6a01,julia +b6d959a6-3242-4180-8fc7-293c297e8516,julia +9747056a-0f64-48d7-a6e4-6fca1ddda47f,julia +93ed2d67-be95-4f29-96cb-91a4233da3af,julia +72a202a2-3910-4092-9a6b-d00e53dc9a9c,julia +afde56e0-993e-4ace-b3b4-444067f8a061,julia +051e2bb9-b786-4681-b90a-bbb56fca0bfd,julia +ab7dc0fe-6f0d-4598-8035-a3259313af31,julia +024821bb-cc73-4f8f-8b96-07a2f1338751,julia +95c4b02f-1080-4c9e-baef-50d8eee70468,julia +1271aa29-e3e1-485d-9c51-63d4e3eb0551,julia +b778da14-94a9-4187-9a7c-47662ee86719,julia +3a1005b9-bc75-4da0-a856-3d19da6dfb38,julia +0e8da6a4-91cc-4dc9-a8c1-029618731003,julia +274a27ed-f01b-42ec-86e8-9e847b8c04ac,julia +1dfac2c8-ca4b-4662-a375-afca7871b007,julia +b92d7cf4-0d2d-4c63-b26f-895b232b33ab,julia +879222ac-53ca-4b8f-a5b3-1654cad5ee2d,julia +51912739-1bf0-4f85-9585-2cd1d5e98f2e,julia +21b87069-fb66-4a52-9a69-9d63fad06579,julia +97b9883e-8f8d-4ef0-b71b-5d9a953bd7fc,julia +0e55662e-1013-4039-b233-843956ce42ae,julia +f9ad7b9d-c0e9-43f8-971e-e4b8492fe32f,julia +f5193de7-986e-4db8-8146-02483e588410,julia +8b66f44d-716a-4fbe-b9cf-1e03af9a4458,julia +5bd21d6e-0dcc-4a1a-884b-b8befc2d39f8,julia +a2bbeec8-3723-4c93-9dc7-182812781f69,julia +33503ae4-83ba-4821-956a-c78bfd6e17a0,julia +158c245f-34d0-4635-8e42-7367952e7517,julia +72cc2262-6e81-4fc9-9316-1406589a9c98,julia +51f5ae40-625b-4f8b-a658-e5f9f96829ee,julia +f550a5a7-54a2-40dd-95f3-2356627b00fb,julia +d174495f-9979-40d7-a03d-95aed70bfea5,julia +bf50d150-e8bc-4787-80e3-38d441c17b83,julia +78c2677d-4deb-4028-a30b-7bfa0af31764,julia +86a74657-5727-4098-a818-f177ebd81844,julia +10e2344f-df53-4aa0-a536-1ae1133ffa96,julia +3fa6d588-a968-4b32-aaed-0cc08da73730,julia +87fe3def-0ef8-4f50-8ea1-91f74ce2ccb5,julia +2e5a0281-af3b-44bd-a477-89008f1345a7,julia +8d4ab6f4-733c-4436-9659-55d9bcb8b69b,julia +34e7a59d-0542-410f-b936-c7fb28f4223e,julia +d2c27b40-3e60-4f44-b99a-6aaadb1d3f11,julia +5252bd3d-7b27-4507-a785-ab0aaba837c5,julia +dd092d50-9f37-4d68-8978-cd5dc7d6c282,julia +458deaac-4224-4a8c-a20a-d502c50a3785,julia +f07e2f29-6d08-4140-a815-b9f9dde617af,julia +e188d788-18be-44f8-9ddd-64e8352a8a9b,julia +122496fa-0103-4874-b5c0-9e3537daee0c,julia +60ee22a6-de90-4b13-ba8d-2b49ab12b6a3,julia +ee44e1a3-69c3-4cd0-9ce7-d6159fdad643,julia +017550a0-51e1-407b-92b0-dd8f08845541,julia +05f816ae-5948-4001-b410-6608f1bb1f0b,julia +61088d0a-4644-46d8-adae-be222a7fb30d,julia +e31f9029-442b-4e4e-bfcc-5e2a2d2ed076,julia +1ff10ae5-bbeb-4ac4-bada-4cb473e926fd,julia +97d501bb-784c-4f16-8cce-025ce3ed7fc9,julia +4cd40b81-7644-4394-ab0b-9e8f5b773422,julia +5b621cc4-5a37-40b9-a073-ccdb4fce754e,julia +ba3e54f8-46ee-4400-bcde-e023455ba1c1,julia +3a999a2b-e561-4cd7-a2fb-d9a8fbc4032f,julia +b45ceb84-d5c7-4810-b01c-00cdaba2c505,julia +76b9a52d-9ba1-484c-8972-33ec9bb78150,julia +f21fc4d0-6cf8-49af-a704-ae7d6b645b6d,julia +c16bb758-495f-422c-a697-de060a17a8df,julia +15fb44e6-6f82-4ade-a797-0646afac1679,julia +1a670a62-07ab-4bb3-be5e-069f1d08e344,julia +7f17004b-ff45-4380-ad6f-9647df9ddb24,julia +53cc415d-75fe-43da-8996-6933fcc54a3b,julia +b3c21f54-118d-4751-9399-6c16c46687f7,julia +503781c7-4c74-4365-b60f-ae4da3a62eda,julia +807d4122-2a5f-48da-aca7-d5dc0a42ef4f,julia +f722f815-da16-4ff0-8d65-d5bf6ba266b2,julia +cd6e2ad4-53bc-4267-882e-3f8341762dcb,julia +c9b25dcf-62fb-458c-acb0-579e1e698a87,julia +1a4664e3-c841-4984-a8a4-304a7d442f25,julia +2d2ac935-319d-493f-ae04-13db7049d299,julia +14a27011-cd7d-4545-9ff3-301fcf7ede01,julia +418cfa95-c195-4935-939b-aa4929827c31,julia +c126701f-41f1-4374-a1e7-43464a95e555,julia +02dab242-b7bd-4d7a-a42a-b4cbf1e3c566,julia +75c86f75-6efb-425d-9d71-770eee909b3f,julia +f0de60b4-45a2-42c3-82ac-efd4354451ab,julia +21d8556a-c156-41b2-9c9e-acb159003120,julia +9c11a465-4dc6-4890-9550-c1d219a6e64e,julia +c166ca76-0651-49a2-bde8-e45012d0939d,julia +7b0d5e44-632b-4dcd-8da3-6e9ec78dfee2,julia +52569a6a-b35b-4e94-af1a-ad44ca99e811,julia +f36b6062-8def-484c-a40c-b6d58a69c3e2,julia +41976651-4a27-4088-8b16-dbaee96f75c0,julia +5ee4e78b-4f01-468e-9243-e5e788590949,julia +9cd8b865-924f-4c14-9472-7828c736b251,julia +0ea3e4df-5570-41be-bac3-7c5b96135c49,julia +f1fc61d5-939f-4ace-9327-228b75162a36,julia +2464c045-9878-40ea-8f16-766fdea50ab6,julia +bd8238da-97f0-497c-98e4-46658a084dfe,julia +b8f8063d-cc89-403d-8fb2-39aa79550ede,julia +a69de70f-1214-4df6-814d-10692c40893a,julia +234d8387-ee26-4940-b615-e5170e8b0e54,julia +cea2d820-6151-4723-99d0-13f865c37068,julia +5382261b-d2af-45ac-8b29-ec16beedb9aa,burningship +4eca5be8-b26d-411c-bc91-14de6e68682e,burningship +b919a5eb-20ed-410e-aea2-c0adfbf211fd,burningship +59c3d86f-952d-4ac5-ad1e-823850881c8a,burningship +b0144e3a-158c-40d4-92ab-04a03a39adbd,burningship +9fcea9a9-ce96-4909-8266-ab3f775896f6,burningship +26e8d276-80b5-4af0-a1e6-a2f1b4947edf,burningship +d2ec03b4-6d03-4129-894a-6677d0540d8e,burningship +66ba8386-bdc9-484e-a981-cd795ac90d29,burningship +41eed977-0cb4-42e7-a4c2-6a7c4988ff56,burningship +a152f272-676a-4144-9c6d-42512a0a3f0a,burningship +96fde3cb-8ccc-40dd-bbb3-e992429709c2,burningship +5dbc4170-18fc-47b2-8e43-4b5d9b8907a3,burningship +6d46342e-e096-4f20-838e-7208c399e000,burningship +58426ec2-1d3a-4d7f-8c7c-1a3fb672156c,burningship +6c819081-ba46-443a-b53e-ff89a5b067e4,burningship +629c8412-7ed1-4de1-9fd4-28e8ed5100ac,burningship +c5f23066-7ce0-44a7-b670-39c16e46b1e1,burningship +c8964d85-9ad3-4977-b1a8-5db4103b7c23,burningship +3beda78e-4f8f-439f-b636-6bd0750e80dd,burningship +4d6159cb-8f30-4b20-b73a-25faad89efcc,burningship +c4fed2dc-2db5-4877-a101-2804c492f415,burningship +2aa6e1ef-9578-4535-bca1-6ebb99382fd8,burningship +4e8660b5-0d1d-4e20-b801-ee2ba54b3ec1,burningship +a92a33b8-905b-4e27-80b1-a210f577c646,burningship +1bc7bfe6-2575-4aab-9324-ec60278cab1a,burningship +b022ce25-4200-4a0c-9bc8-8d194b3e8d8c,burningship +911626fb-1235-44f0-bbf8-271bba46ad2e,burningship +72af771e-b992-439f-8717-11ea8c795836,burningship +ca395adf-4159-45ce-8cd6-542ebe2b6b12,burningship +a7e67ed6-97cf-494f-82c5-536c86d680cf,burningship +ae7d7b1b-020f-4c20-82fc-f1c1c719cc54,burningship +d3f5e48b-4e20-4b2d-a3d5-e7bc3a716691,burningship +afd5354a-b69c-4c1b-a5e7-810492ffc937,burningship +c39686f8-7afc-4866-8e2f-0e93caf78024,burningship +b88302db-7ed5-4cf9-aa8d-c88d792536e9,burningship +7944cf8d-3e3a-48ed-8217-ac90f8032445,burningship +d2de6ffc-74b0-4611-8342-9a07176f5e36,burningship +d6ecf30f-dc1e-4247-a752-b91d9ac2f472,burningship +382f8adf-337f-486b-a8dd-ea0978f0dd4a,burningship +cf46bcbe-22fd-489d-9f31-857a35b23bfb,burningship +08eb7c9e-4d94-4fdf-944d-7d6645d0887e,burningship +4ae9ec15-f91a-449f-9201-6313cddc1dac,burningship +b5900bb0-d062-415b-ab9b-f366bdf071ba,burningship +f80963d3-e27d-4be9-a668-0d353506cef1,burningship +0a61268d-9ccd-4213-bc93-65689bbba9fc,burningship +c76a900a-3424-4651-aa17-f48225f5c24b,burningship +bf21752b-6a8c-4af2-b7f2-b8bdf4df76d0,burningship +2d7d7f47-7143-45f9-82da-c7c130ff9391,burningship +c9e032a4-7a3b-4abe-8176-64c8714a12b3,burningship +00851e15-ab90-4b8f-93c0-df301d2efb4b,burningship +4278db31-5fcd-4679-a78f-5403ac3d89ec,burningship +4944171a-8a59-4f23-8af0-63462c703809,burningship +9860eb6e-d2ee-4a5a-aca1-17ba8ac68276,burningship +1c59a39d-1313-4c54-a207-489a82aa62d3,burningship +5c88b874-d58c-4b5c-a62e-3b34d7c2f3ec,burningship +ceb73df6-81e8-4c16-88c9-42467fd7bacb,burningship +c3257f01-723d-47d9-8d20-f2870db3af50,burningship +132938fd-83d8-4c9e-b518-be8a274ccdfa,burningship +6a7d0c39-ab82-4812-85e9-03ce56f43137,burningship +614ef1fc-9123-48b7-8d81-909dfde000df,burningship +db7e0dd5-9e8e-4d68-9d12-84c9e0df9507,burningship +2ec5380d-e504-463d-ab47-7788d5437720,burningship +edeb056c-599e-4446-b7fa-1ce5f239d481,burningship +99d4c31b-0422-492c-91fe-0fe6ffc51cc0,burningship +42969142-a765-4db7-a76f-c2c611b41ab0,burningship +164403c9-534f-484c-a702-6afe17c9b2b7,burningship +a77f7a75-156a-4840-844c-68b6313fe1a4,burningship +15463a2e-1ee0-4eb4-bc19-1cebb074e15a,burningship +c47343fb-bc34-453e-a95d-c42b6186ae22,burningship +ad1bad8f-0dca-4bd7-b649-1e8145ecc44c,burningship +f1f72fe6-171b-4748-842c-23e949632ea8,burningship +00255a6e-9379-49ee-9baa-1f61b2973de4,burningship +43d5da6b-ce5e-4d85-ae35-4420ff8a5f88,burningship +a07abce7-891b-4c6b-a9cd-37bc27dfd362,burningship +2b130493-3cc6-44fc-9cb8-7aa55948e5f9,burningship +49fcc5b4-9f44-4cf7-90e4-2e8445929513,burningship +952c5c9f-8711-4a23-89aa-12ff24465200,burningship +d9576315-87a6-4774-b8b9-cadb70b61e68,burningship +d83ffb5e-5ba7-41f8-9d28-4817a2389a94,burningship +f6a90662-e683-4ddf-b4b3-64a938dd60c2,burningship +ab22206e-c087-4659-a02f-04e2ba21fdfd,burningship +82a7bc5d-7fbf-4aab-94f9-b8ebe6cc7af1,burningship +b33af60a-a92a-4e87-8d38-7fea9b430b61,burningship +2a5aeb3c-76db-4388-9ede-c324a07ab962,burningship +8da0ca6d-c737-4a99-9c43-118f128d5284,burningship +329987b0-fe93-488f-a73b-04359704abef,burningship +3f4f6fa3-2a7a-4de3-9863-51fe88780398,burningship +f6ad60a1-88b0-45cf-805f-ac5a2e0cbd6c,burningship +24fce416-fd76-4991-b5bf-4409e17504eb,burningship +de913405-1106-4a6e-8f85-6c8e59c4c3b5,burningship +779fe858-616a-4169-854e-71ad755c9662,burningship +dd3b2e7e-da31-4a8b-9095-9fc8002f267f,burningship +65fc44ba-e508-416c-a1c4-607d20c5e356,burningship +85ef3ffa-de84-47e9-9884-fea6c1e609f2,burningship +d774a4de-6032-4741-9239-d3dd04fe82b9,burningship +7ccae882-c4be-467c-98b4-94484fc1bbc7,burningship +380ae0d9-1634-4eb5-82d3-148e56f8d291,burningship +55b70551-cf9d-492d-b21e-f8802f0e2efc,burningship +664d35e9-2ad3-4a38-bfd8-7fd683255f60,burningship +0a41cffa-1aed-4e33-863e-c1ecbab89a89,sierpinski_gasket +4526c302-d268-4c12-b1da-726079ad99de,sierpinski_gasket +b8e6cbe7-f706-4e6f-be18-0d680d627606,sierpinski_gasket +1a515544-974f-4438-86ac-bab120abc300,sierpinski_gasket +89d141c5-0a9c-4a05-af32-48dfd18002ac,sierpinski_gasket +d508133e-0ee7-45ab-9b55-4ba134df4cc6,sierpinski_gasket +f3072083-1dde-4ce5-98f7-93d3f6897769,sierpinski_gasket +9c262125-aace-4ab6-8698-3449de6d2c75,sierpinski_gasket +881f4dc1-8457-49c8-becc-bfbef75f5c2b,sierpinski_gasket +5219de65-3fbe-4355-be36-9de4db26dd39,sierpinski_gasket +7cc20a9d-2b7c-4c80-bac2-ad077ca9126e,sierpinski_gasket +348ba41e-31c8-407a-b65e-66e606dcadfe,sierpinski_gasket +35e7c770-db86-4fe5-9660-0dc838443c3e,sierpinski_gasket +b778fcc3-5372-46be-972f-973bdafd19ef,sierpinski_gasket +054f5b31-c78e-47e1-b781-91d3be5c57a9,sierpinski_gasket +cee83f69-590a-4022-8f38-f703f6a40a23,sierpinski_gasket +da2832a9-b1ab-4e95-8ec4-bee0a58ff437,sierpinski_gasket +e2a9dc8f-bede-4623-b1f3-1755ea10d29e,sierpinski_gasket +d97535ce-4bec-4532-bbba-4bb4c1914c58,sierpinski_gasket +df45e9d2-ea0d-4911-81cd-feb8c5c2f3e6,sierpinski_gasket +017f842a-fed4-4167-ab20-bca74ac393e8,sierpinski_gasket +f73f81c3-08c4-4b38-9d16-ce6cebfad675,sierpinski_gasket +42a4c285-96c2-4818-9918-0deb90b1beaa,sierpinski_gasket +fef8081a-0e51-4ad3-aa81-eebcdce0e1f4,sierpinski_gasket +18edcd67-0ade-4be1-bba2-b0f96728e585,sierpinski_gasket +54915f51-3457-4476-b817-c8ca9fea798d,sierpinski_gasket +e28bdb74-1da3-4f13-a5b8-d01b43e83e09,sierpinski_gasket +c7dc55fd-1eec-4314-b357-342b1ac8485d,sierpinski_gasket +8d69d2dd-afb7-41ea-959e-bb9cd2550e53,sierpinski_gasket +efbfd2ac-d036-44f3-917c-95cbd00a7bfa,sierpinski_gasket +b07d17d4-baa3-494c-81fd-1c7e09b9ae61,sierpinski_gasket +d65e0fda-2a55-4479-b71f-44f268519b41,sierpinski_gasket +9ab049ec-b996-4e6e-8c31-688a89a1b944,sierpinski_gasket +6963c2eb-c32f-4da5-870d-848100fb09db,sierpinski_gasket +72470a38-bf8a-42aa-b79f-47fded889aa8,sierpinski_gasket +9b8d03f5-1aef-443c-9d83-10bb8d4e235c,sierpinski_gasket +b8b9b5ec-61e9-45c9-8508-1690a54b55ce,sierpinski_gasket +4d87b459-f2ce-40db-9bb7-a1362cc4542c,sierpinski_gasket +e3d3f86b-7d9b-42cc-ada7-83f1051c0787,sierpinski_gasket +6b500914-57b0-4684-a85d-93b13abcf2cf,sierpinski_gasket +b30022d6-197d-4909-a003-66c010c80f4a,sierpinski_gasket +2dde658f-aa78-4878-9e99-c0df16ec3c0a,sierpinski_gasket +8cb5b59f-d251-45a4-9b50-2dc2a26bfd48,sierpinski_gasket +7550b5e7-3b15-4cdd-96c4-7e1196329052,sierpinski_gasket +d907cb21-7363-42bb-a480-52e1403906e6,sierpinski_gasket +65b34bbd-76b3-4392-97ff-c879433a7411,sierpinski_gasket +93f9856b-d67c-4844-b29f-06634ce56a34,sierpinski_gasket +e5ad770c-7241-4a60-a4fe-6249ee72ebf0,sierpinski_gasket +2b9b3294-92f6-4fdd-897f-97e101033afc,sierpinski_gasket +cc3d97cf-18dd-4780-8118-11bafaeb7c5e,sierpinski_gasket +cdf28762-fe51-4a85-a49c-397ca69f82d3,sierpinski_gasket +492385e1-5622-4500-816f-b0f9e17638b0,sierpinski_gasket +014ff422-66b8-4f30-9b1d-fa1459ff1e31,sierpinski_gasket +4bb251ad-50e1-49fa-b049-6a74cdca99f6,sierpinski_gasket +028a1158-2fa9-4d5d-a836-ac20d87cbc7a,sierpinski_gasket +8eb0db52-ac86-4f31-9323-36141acc30fe,sierpinski_gasket +1b5952d0-7a8f-42ec-94cb-e277da18026d,sierpinski_gasket +3e77a6c2-643f-43f8-9bc1-58c10a539f7a,sierpinski_gasket +35a10e85-9249-4893-a531-c8805874d7f2,sierpinski_gasket +2fab1053-5e82-406a-9965-f1a4016786c4,sierpinski_gasket +ba56eae3-69b1-494e-bb76-91a284f10fd3,sierpinski_gasket +2dcf3ee2-a55b-46a4-849a-4c46b84fdc9c,sierpinski_gasket +b9977686-0bc4-4b1d-bf52-f17b6e00f1e1,sierpinski_gasket +d77bd5be-25b5-4dae-83be-c04c7f02005b,sierpinski_gasket +15cee252-64dd-4a54-baa1-c5a563f4f070,sierpinski_gasket +ec8032cd-8f0d-4a16-b09e-0b05a2637321,sierpinski_gasket +51af2e4d-8287-4690-8865-f364f3cdbc2c,sierpinski_gasket +8a725dbe-9184-4f57-9c42-48976f764493,sierpinski_gasket +09c461d3-7d56-4761-ae06-f0f96c612e3d,sierpinski_gasket +1f0cacdb-a65e-4de7-92da-9f4b49ef687e,sierpinski_gasket +18afe03d-f807-4de4-a0f5-b83144fa2e4e,sierpinski_gasket +930e7cde-8d56-499b-a62e-8000f8831f5a,sierpinski_gasket +042daadc-6594-4074-b15e-9da8ad66c1bc,sierpinski_gasket +590b3a1e-6ea0-43a7-ad73-802edc515840,sierpinski_gasket +d5e4c03f-7cfc-41d2-84d4-ac0be87132fb,sierpinski_gasket +e4919f88-3ea3-47cf-b0b5-88920a253e76,sierpinski_gasket +d528704f-f33b-477c-ac8f-d4d444be4669,sierpinski_gasket +67afa486-1431-483d-aa95-f5cbe81e70bb,sierpinski_gasket +797ef259-8194-45ed-80d2-1f9a9ddd9c80,sierpinski_gasket +5e7fbf3c-8a12-46c4-b382-5e548e4490b9,sierpinski_gasket +b30a47b1-c6ba-431e-bbc5-3b43a796ee9d,sierpinski_gasket +daf58989-eff2-48aa-946b-efd0e288b20e,sierpinski_gasket +6af098f2-ba55-4647-88d5-1eceb7b2a626,sierpinski_gasket +216825f2-f90b-4fc2-8254-c847dc7fc273,sierpinski_gasket +63664734-5649-4dd8-a67c-8948a8f2140c,sierpinski_gasket +2cb22424-bc8b-4457-8fe7-c615e648cc15,sierpinski_gasket +53eb990b-872e-4069-a90f-60c155f71a35,sierpinski_gasket +8dead11a-5a09-45ba-bc5c-89d80895df83,sierpinski_gasket +18b6b98c-c7b3-4b91-af1e-bb1b202380cd,sierpinski_gasket +fd663499-0a67-4f08-9989-af436375f74d,sierpinski_gasket +c1094506-aef2-4ed0-99a7-e4fa8bce8d3e,sierpinski_gasket +f3fcaea8-d65b-4793-b2af-b94033f89da7,sierpinski_gasket +8da4065d-e7dd-47df-8b2c-992ad5667bad,sierpinski_gasket +a9c307a7-35ee-4c5d-90e8-5f90679cf0ac,sierpinski_gasket +157396b3-5602-44f3-a1c6-0e7961f8a9ce,sierpinski_gasket +afb49be3-4689-49b0-8cd1-b0dc4ba08e01,sierpinski_gasket +b5037a4d-081c-45e3-8151-39ced5de6d4f,sierpinski_gasket +7c78fd18-d6c2-4795-a96a-ce2511ccfdc4,sierpinski_gasket +b1a9e05e-0020-45b0-aef0-ebcd375f37c6,sierpinski_gasket +420492b8-5fd1-4057-877d-e55325788391,sierpinski_gasket +d78eb7ce-0f7d-4c5d-a0a1-ef620a622a10,newton +b0fbf2cd-526f-4eb5-a848-4a5eff975826,newton +a203e8f6-32a1-46aa-b4c3-7a180a60bc9f,newton +bb2551f4-ea8c-4eec-b42a-e65ccc275659,newton +01ff4e0d-3fab-4481-87c2-fe3f6970536e,newton +7e4e302d-0b6d-4dfb-b183-2bc75965857e,newton +17aaaa43-0d09-454b-9307-6681008f63f2,newton +6b4dddfa-8514-4204-8b67-a70f1582e4c6,newton +5c122c9c-a082-40d1-a8a9-6b28a4174fd2,newton +f90aaaf9-bc6f-496c-ba88-435c2b9bb731,newton +df3bd8bb-48ec-4c2e-a042-450f6e7cb3eb,newton +b6917c9d-b016-450f-80d8-0b55b5a14748,newton +129fa0e1-165b-44e5-a2f2-b5f3a9a191a9,newton +2e9ca645-1bba-48db-8dc6-8e9beb0aa1dd,newton +98c429d0-9053-4349-955f-0cb35f109d0d,newton +92073bc8-f7aa-46bf-b366-546b9de8e462,newton +c14e44dc-174f-4304-8edb-793fddb4731d,newton +2297093b-eecb-4fe9-98d3-7eaf1655ed92,newton +76504cbf-157a-4840-9f48-b6214f4e1747,newton +6df3ee26-4317-436e-a6b4-15e4ce312f1c,newton +455c013a-2365-4b46-806d-42c43e4b894f,newton +bdc93ddf-16d1-4f41-84db-0cccd91b3c9a,newton +ada33242-78d9-44b8-ba55-9220a6a10bb2,newton +8db95878-1329-4c9b-a4e0-5c11bafbb517,newton +98491b1c-0897-4165-9a71-5186f326e88d,newton +67a7f1ce-1c5d-4baf-b1b1-406790428094,newton +a10d5d91-2089-46db-9d02-d5e8d36b9f71,newton +f73f5194-49b8-4ecb-b92a-2acfd4eaedba,newton +4dce6951-8901-48ce-8092-2d05059d0797,newton +6add4ab3-a893-44f8-8241-f4230c5ce857,newton +f9091e00-b455-4748-b227-45ba90671c7f,newton +b5958c38-d722-41b3-bdee-c19a0c8f50aa,newton +7b0346d3-f3de-4737-be3f-e33c71903ae5,newton +687a2a2b-3393-4788-999a-e61d8f72d8b6,newton +cce94348-bd9f-424c-8789-3f701b092ad8,newton +a659dbcc-ac92-4ec4-adce-48cffd553646,newton +c327c54e-b50c-4cd3-9e0c-36bc4c53aef3,newton +ee9ec32f-d3a4-4f5c-aebe-e716e911d15b,newton +59c61895-59c7-40ce-9794-724aa95f1959,newton +56c93513-7a28-4fd0-8de1-a9d52a972e09,newton +5ddabfac-d483-4e74-95d7-c886ff715a71,newton +3667b38e-fa25-43a4-aa80-7d96cf032c82,newton +e4811f3d-6894-4f53-9738-f853008f5af1,newton +e829700e-26d7-40de-b06f-d2e37f0dfb9c,newton +5b803587-1e0b-44cb-95c3-a0fbd1ea27f4,newton +a331a061-b677-4254-abcb-9b38eb459b88,newton +d7e82fe5-c2b2-4988-924c-e19e3cb9d325,newton +61435258-8298-4a70-9625-b0b317bb9207,newton +7f5ecc51-2c15-46c5-81c4-04440e57cce9,newton +509aa764-07d5-4c49-81ac-29924901a8b7,newton +d0335fd0-141b-4bae-807f-37e443c1145f,newton +aa821869-41c6-4d92-afc2-d304b5703b9a,newton +02c98e50-92aa-4131-85ed-ee9ba68b5ca1,newton +1f18cb06-f377-46fb-ba9c-b0be95bdaf84,newton +5e691ffd-52d6-4a17-8586-24b8a8d9b56b,newton +f7b0db61-7d90-43b6-b635-d05da4bdff61,newton +c4c8bb8f-4958-4dfd-91c9-2b3989b9b692,newton +edc4043d-476b-47e0-ac8e-a5f9d07b562a,newton +b90ae93e-6ef5-4658-ae06-bb1996a03208,newton +cef83a9c-20db-4b89-b2bf-e437de7b5de3,newton +0c77a332-4e7c-46ba-b607-0fd9a3c45a97,newton +26354760-ba59-4458-9f62-6e5e3cdd324f,newton +58d2a520-59c3-4f8d-be52-cb8646bb22c3,newton +a998968a-f009-43ad-bd27-a23e3a43956f,newton +1a2fa65c-e93e-4118-9f94-0c84976c925e,newton +b3d41709-bee9-4aff-9ce0-0a274304d3bc,newton +2d629f5e-f348-4b5b-9e5f-35e76f40150b,newton +9ac7974a-747b-48a0-8c3f-bcbf1e8546cf,newton +d14d1a39-f8e4-472e-8ea0-e2ba3797e8e1,newton +2fc42eb8-246a-4bea-b7c2-d3377fd0e965,newton +352d1b9b-1470-4d49-a3ff-8e6351fdd928,newton +d7c8f252-987c-4393-8d4d-fa2629605104,newton +df3aa48b-35b5-4729-907f-52d0c15a95a9,newton +8cb44d8b-101d-4cf1-96e0-648d554dfb02,newton +1a8250a6-4428-4226-bdd9-d1519b1523f8,newton +cb38cafe-99b5-49f5-8efe-989875d5e331,newton +78f82b9d-a73a-47b6-bcd8-a58cd8262d53,newton +5d0d3b4c-06cc-4ecd-80d8-5923cad89c8a,newton +7dc8ee16-6989-4bb5-8a65-a531abf0e8e3,newton +f15bcee4-fbd9-481b-8f19-fb6e1026568c,newton +a737fe9b-e2ca-4d48-8ba6-02509e4390e8,newton +6809fc83-d6f2-4c84-831d-58a28fc97495,newton +8f935853-4a63-412a-bccb-6dddf7b795bd,newton +992251b6-7e41-46a4-85f6-841f5bb2d91a,newton +803ce908-806f-4186-94b1-f5f68b24868e,newton +1e9e3139-36f2-4000-b2d3-afe5a37454da,newton +f21740ed-66b5-4cf4-8c77-d9eeacc32dc8,newton +f3d3b142-3bea-46f6-9042-07c8f1eda137,newton +f840cab7-8230-4552-a330-18eb4fca018c,newton +06a62d86-229d-4f0e-9f7a-f7fbc9b56e85,newton +0a964709-4a98-4111-8f9d-185bd25c8241,newton +7b94c4f9-534b-4fd3-951f-dd5a7fae90dd,newton +96ebeb5b-9d84-453b-9a28-6abc4a76c7c0,newton +605422a3-a1e5-4038-bd5f-ff883d3dfcb2,newton +c608c852-ce01-4422-b094-833b2546da9e,newton +4281c51f-f70a-4b6d-8c66-37138eb703bd,newton +eb1337ff-d70b-4d13-aff3-2348db592644,newton +92bf4817-fcf2-45f3-bb59-56bb2b605555,newton +f48caac9-69d2-4b7b-bd25-a6bc36633acc,newton +1646b3e2-09db-48f6-b175-3ad16895bd45,newton diff --git a/lib/src/test/resources/fractality/small_test/images.csv b/lib/src/test/resources/fractality/small_test/images.csv new file mode 100644 index 0000000..36e4ea7 --- /dev/null +++ b/lib/src/test/resources/fractality/small_test/images.csv @@ -0,0 +1,60 @@ +image,label +959a33c6-cc99-4393-8c34-118c1d041a6a,tricorn +ef313b2f-2af0-491f-8125-391c66230c4c,tricorn +e0265b98-f4f8-4263-bb92-def5bde11240,tricorn +eda5cf78-33aa-4ca2-a538-763b71f136f8,tricorn +908f066d-a59a-432b-a298-f696f12839fd,tricorn +b3cc4024-2fdc-44ff-b989-2162ec987d9b,tricorn +db679623-1a63-4e4f-ba4c-6bd3f2118764,tricorn +0ff95717-7241-440f-9ced-001efcc9d96e,tricorn +126fa1c6-9b40-4709-b59b-86c8c710807f,tricorn +e40be9a5-df82-47e9-b8e4-03a36230f7ce,tricorn +00b821b1-d555-44c2-8aba-6ea4fcbd7af6,mandelbrot +0c0d100c-df25-4b3e-9fae-3643278d3908,mandelbrot +56dc70e0-9273-41ef-bc20-24cc5fa7bca3,mandelbrot +c2702b71-a1f2-4615-bca5-f5ab06ec2e52,mandelbrot +7052b8d9-6a51-4e3f-804c-e9f0325580dd,mandelbrot +cca1b176-eaac-4005-8b7c-a547e6ecc026,mandelbrot +656ca1c1-34be-465e-aa37-809e06b86754,mandelbrot +6147571f-019a-4354-b90a-aa3ded1de9e2,mandelbrot +2c4ebd8b-03ce-4b2e-82db-098c08f614e3,mandelbrot +6fbdcef4-df5f-433a-9391-6a863f1160f2,julia +cd6b4b0d-bf85-4592-b3ee-28ba8e657884,julia +59b080a9-a074-4ca4-860d-8c59bc71517d,julia +f9dab0c4-a540-4927-bc6c-bae0aa4514e2,julia +47c8d9fa-fc96-4edd-a447-2346ed2b01ce,julia +d03f8fbb-f709-4f2a-9dd7-cf7b0f10482f,julia +09fcb7fb-37e5-4167-92d8-9ceb5813c231,julia +a26fcfed-fa78-406c-b7b5-d283deaf7731,julia +9c57449b-6858-4587-aed5-dd6b3fda3e32,julia +75fb2a52-97ad-468d-bde2-dca57236128b,julia +ec886374-569c-46f6-80b2-0e597cfa1d02,burningship +b146a8a3-9a99-4248-a0f1-1c53b5a05db9,burningship +c14c7379-f3c3-46fb-92b3-ce9dbe9bd56e,burningship +f270c31f-5e96-42d4-aada-f96846c0d66c,burningship +a59bc53a-5ca5-4233-a491-eee182af5859,burningship +756eae80-7b4b-45e3-8deb-4794f8a8f111,burningship +6c4798f5-e272-429c-b835-b1d9ee6d910e,burningship +b8c1a577-4cdf-432b-bae2-1389701d8322,burningship +024a6907-9fae-4414-84cc-54a678759d26,burningship +58cb3e86-d194-4aeb-aaca-e0109b00c48d,burningship +38b0a892-5d3b-4bff-86ec-9c93ed2fec14,sierpinski_gasket +7a6265b2-7dfe-40c7-99b6-7cbce002c50c,sierpinski_gasket +c63a558f-9d37-45bd-9955-918b847f6ed5,sierpinski_gasket +425107e0-7861-4231-85d3-0f44b9eff2d1,sierpinski_gasket +3bfb6bda-9c0c-43bd-a990-108fbe06638d,sierpinski_gasket +05931638-c22e-4514-bb07-985ec99b06bc,sierpinski_gasket +f6e97837-84e8-4c4e-80eb-4ea357360d7e,sierpinski_gasket +8ac95703-cf5e-433f-9843-f8e51a61eba1,sierpinski_gasket +a9752e57-c0d1-40ef-9305-14ee77424310,sierpinski_gasket +1e1cac3f-5ecb-4fcc-8796-c0cbbb4487a2,sierpinski_gasket +75e37bdb-bf5a-4722-8444-c5b6de0f7034,newton +f821fd5a-e2cd-4970-9e17-ea66a0e30f52,newton +36630b4d-d4e2-4bf7-8ac3-400d3f967234,newton +9b5418da-f03a-4d0f-8177-e01b093f6a15,newton +f7946aaf-b818-4136-bbe0-5ba621fac034,newton +a123ec1c-f48f-4079-aeca-fffe82ac809e,newton +b88d1a4c-35b0-4c58-a7b2-ac5640c2712e,newton +a07f8c59-5801-4835-83a5-900289d96b1b,newton +494f521b-449d-43e3-ba8b-5f77d03b30a7,newton +49640233-420d-4ae8-9361-49d62017a50e,newton diff --git a/lib/src/test/resources/fractality/small_train/images.csv b/lib/src/test/resources/fractality/small_train/images.csv new file mode 100644 index 0000000..296ac6f --- /dev/null +++ b/lib/src/test/resources/fractality/small_train/images.csv @@ -0,0 +1,301 @@ +image,label +01fbcf1b-1041-4ca9-b7ad-a702aa833ae4,tricorn +314071c8-ab58-4504-809f-6f27e131c727,tricorn +9523521d-42cd-4f82-bffb-0e2c14137c11,tricorn +9a08ac4c-9941-46cd-8770-ca942c854f91,tricorn +b5123ff3-b932-4a33-b91b-970670db1528,tricorn +659ae697-03e4-4f49-9331-c6a46cadc10c,tricorn +c4c3675f-c2ab-42e1-946f-31c503c461ee,tricorn +44a9c3d7-4d84-45a9-952b-218c97ed27b9,tricorn +a7a20a96-e3cd-4cee-b279-5e573795df2a,tricorn +151dda25-46ae-4dd8-9df8-28ed37d4b4e6,tricorn +dfede352-e375-446d-bc14-853799f565c7,tricorn +4ec7bef0-556b-40ec-8093-274fac51f8c3,tricorn +e3ef3510-c9cf-4414-8169-e1e8abe7ebcc,tricorn +e712d2cd-8d29-455c-979a-78670edeb407,tricorn +35ee0477-0186-439e-ae7c-083ee8452c3d,tricorn +30e46770-55c9-4b9a-8c0f-18403647cfe8,tricorn +7e1cbafe-08e9-442b-9ac7-668797249b92,tricorn +8e396d10-10e7-4e5e-be3e-96b93cbe441c,tricorn +56e61f13-11be-4b39-8e05-5050bd1bce60,tricorn +7a6992a8-97e0-4bf2-a979-d0ae64390cea,tricorn +d2baa1f8-1613-46d3-8a7d-7076163e24e3,tricorn +425186b9-d259-41d1-98d1-9b168d39d325,tricorn +0ea53d8e-78c2-42c3-b2fa-497976772d0f,tricorn +f687694f-dffd-49f4-9b04-f9ae4fa6fc7d,tricorn +e19ec069-f0bb-4374-afba-f33a6d90d617,tricorn +185d2854-1d31-46af-befa-3b827df73164,tricorn +7a3b253c-e879-41f5-a0b6-bdf715ae0a2d,tricorn +f5954210-dc72-43ff-81ff-3d57b736d00a,tricorn +ccca3d5f-05c2-4ecd-9db9-ab6983dda3d5,tricorn +a7ec829e-6d19-43cb-ae66-d0e12d7db9df,tricorn +cf92fba0-fcfe-4d67-a295-1f12bb2ca1b5,tricorn +65bdbed3-f3a4-48c9-bdcb-8057802d2b43,tricorn +7bdf6e1a-e4a5-42aa-837a-aa6899415970,tricorn +71bfdd6d-96e9-417d-8eb9-9b992ea04adb,tricorn +0c7553b2-f05e-4381-b618-5c27d3e03796,tricorn +e64106d6-37a1-4d5c-8d0a-c6e1ce2bca64,tricorn +fc57a4ed-fbb4-4076-9d53-660fc08e48ca,tricorn +17cb815d-1750-4303-8473-fddf69ad6d93,tricorn +c9dce87a-9e40-4c3b-ba86-daff8c8836b8,tricorn +df0b8516-3f8a-4107-ada5-ba77ac8e8a95,tricorn +f74321eb-42e5-489a-be18-89ae533024cc,tricorn +7f98eeef-c0ed-4c08-b541-b252d41a3880,tricorn +62f088ac-b6e2-43bd-b826-c26886f65f40,tricorn +823511fb-2cf9-4500-9f75-f39388c8ad05,tricorn +e8e5c396-0ba6-4ff1-8ac4-21a91942a4ac,tricorn +aebeda30-2bd3-4174-a3f6-6861e89c73b1,tricorn +147aa3d2-dca3-45bf-867d-5d6488f8c35c,tricorn +45dfa04e-a117-4f5e-b854-f148c4db9ee1,tricorn +5da9ef0b-c5d9-4365-931c-16c437eb23ac,tricorn +e8035c12-0cc7-43f1-9ebc-7ebf7ae3d116,tricorn +7e4da43f-c27a-4f65-8a92-186891e8fe7e,mandelbrot +c1e13f7c-e2e5-4afa-8437-3d2f0407e191,mandelbrot +3dd2aa5e-48e6-40a7-aab9-a20f3eb1c4ea,mandelbrot +188d9c59-75e8-4f11-9fee-2e08f3399684,mandelbrot +962dbbc7-0cb4-4852-b4d9-88e867f4baba,mandelbrot +007856d3-f7a3-492f-b442-0d22241ed122,mandelbrot +7d1f3485-c9e1-47ad-83dd-90387584e420,mandelbrot +d0bd6ec9-df39-4772-8091-329884b4ab0d,mandelbrot +e30e08c2-1ccf-42fd-92cd-fa4626d72aee,mandelbrot +4d1e9f79-7658-418f-884d-330e19ad1d3c,mandelbrot +7c2d054a-c915-4f8b-b510-930b317846a0,mandelbrot +7d31a809-c999-471d-86ca-3ba46fe7b4ce,mandelbrot +bc25df96-c512-47b8-a430-ccdbcbc44d18,mandelbrot +08bfc81f-db9e-4637-8bb2-1743cc388cd6,mandelbrot +a72506c3-5ff2-4fb5-968b-673aa7a7ba61,mandelbrot +433115e2-dda8-4808-9846-71cccd0390b5,mandelbrot +b1df50e2-3d75-4998-9082-25d0ec91e403,mandelbrot +64a6b157-fb83-44d1-bfa8-9406c2b0b7b0,mandelbrot +fe9869b0-2656-496f-be5d-935cb7635790,mandelbrot +a8d2fdae-4e99-4df6-8439-4e077dbb76cc,mandelbrot +655fe375-cc2f-47b9-a1e2-28932b2f5fa1,mandelbrot +a76d3b28-4f7b-4f35-8079-c0b52c029704,mandelbrot +d615493f-7054-428d-9952-509880d18dd4,mandelbrot +28b19495-a1a6-492d-80a5-e37ccfb7ed33,mandelbrot +3f7e3106-edaf-4bef-bdcd-3a5c99372872,mandelbrot +629feabd-bfd3-4e44-ae86-aad18fb9bdc7,mandelbrot +c92eb442-a217-4cdb-b842-b76e34d112a7,mandelbrot +ab616ac4-88db-4968-8060-d685de8fbc66,mandelbrot +c533e042-5b02-4636-a0ed-18728b38f805,mandelbrot +c0953b54-343e-453f-9cb6-c6050d4c7ca1,mandelbrot +b2847c79-2421-4692-9543-e2eadf9666b3,mandelbrot +9060cbfa-3c7b-4c89-aa06-7b5e5634b25a,mandelbrot +a242cfe9-82e0-4e76-bb39-58f77119cf1d,mandelbrot +a962e270-9f6c-4168-9865-a73474fe8488,mandelbrot +524ad1de-491e-4205-a530-91efe9674e2b,mandelbrot +218b85a4-fc55-42c0-a27c-bb43c915ca4c,mandelbrot +13ecd1a4-d0b1-471d-9cfc-58a96a274d76,mandelbrot +674c477c-9752-4ee7-95bf-122d97102e84,mandelbrot +81195b09-6802-4b66-9641-273ff67d7838,mandelbrot +534f08bf-8479-48bb-8a34-3a276b41c39b,mandelbrot +b5655c8a-d6ee-4b31-b0c0-e70972ee07a3,mandelbrot +5c561f5e-b56a-4c90-b352-bcb571045295,mandelbrot +6523fbfd-f6b3-438f-8a49-1c9eccc085d3,mandelbrot +115adc72-e196-4fee-bf6c-585bef26b2f8,mandelbrot +7fffb34d-aee9-41fc-9934-ef23292a6440,mandelbrot +b31d0f10-721f-44d6-9907-aaa8f59b493b,mandelbrot +31fedb35-d494-405e-a4b0-9bed0c535d49,mandelbrot +d7b15f79-00ff-4f39-8925-b54ebf6c2743,mandelbrot +531d91f9-c829-4dce-b7f5-8796ee6c751a,mandelbrot +a2887395-0568-4f75-8b92-9499bd73f370,mandelbrot +29475770-850d-43b6-8eb6-08800c733135,julia +365ec8dc-c49d-433d-9364-7f04002bf3a0,julia +94ddf178-a39a-4bd1-8c8e-d2643dfaad58,julia +18214918-5639-4f76-9b72-5dd81778e7ea,julia +f9cf677e-d302-4d52-b631-579933c40791,julia +c88686d8-e7bb-458b-85e4-a40a25ed7906,julia +2e4d5dea-e400-4f48-a9bb-37900be20693,julia +39683c31-3288-4880-bb49-b03f2854527c,julia +4716955c-a614-4022-b9c0-3cfafc967b65,julia +f330ffe8-77e1-437d-9e31-6b4ac9e9c18f,julia +8bded5ed-b3a8-4183-9482-03f6b43d8a2a,julia +44ae75f5-bc14-430d-a35f-1e53f1b0f73c,julia +c93be053-5937-4c2b-a9b8-6936c81e1a0a,julia +5f584919-1a19-49ba-ac30-9eb1832ad87f,julia +b8634284-dccb-40fe-8ca3-58907fba8d2b,julia +16c73e0c-eaeb-4f71-9a3d-11c983aa65af,julia +fdc8df38-4bfb-4f2c-8317-d80ebd68be30,julia +bf743e7a-9261-4e1a-962a-c8d34300f0ee,julia +55f0df9e-f19d-47de-aceb-797be3ff64e8,julia +19d6ef51-8e96-46e4-a6be-72643c947a84,julia +e17d1678-8d1a-4a86-91dc-e864b867d076,julia +183224ef-b9cc-4626-b9fa-f16e3727f39d,julia +df62bbe6-5755-4acb-bcdc-2fd9680c7a99,julia +e4f2a263-2cf5-4718-9fbc-f74508ad3dff,julia +3c8e170b-7dce-4a6e-88d6-34628db02b4a,julia +9fb788dc-b669-4821-80bf-437e844db01e,julia +e081a8bc-d78b-464a-9eee-31cbf0f36a75,julia +f0d37ab7-544d-4d74-b7d0-58c30f569425,julia +4a1c0abd-c0d8-4912-8eaa-7f33c432e602,julia +158eb756-f8f5-41d4-90c7-e7312a9055d4,julia +7077586c-cadd-44ef-a666-3c8a97bace03,julia +9d8586ac-1b85-473e-bd9d-7e63a5b3e13c,julia +2e329fab-68d9-4b53-b842-e93b509f5c85,julia +09ceefcb-caa1-40ff-a2a4-7dfcf8be02e0,julia +719f4158-0142-4469-a6fa-caf32854b416,julia +1d66683d-77cf-4ef7-9248-637a650fc8b0,julia +86c4a4e0-763c-4ca1-ad54-7507881cab8b,julia +5d88c3a3-0892-4de5-958f-3f1191cf3bf9,julia +2a230385-299a-409e-9fd3-55d69dadd0d0,julia +c3ba3fd9-fd5f-4d47-a5bd-df0cd7677b61,julia +ae28e950-50a3-445f-a970-b7e1f7c2307e,julia +e050b66c-1fbe-49ae-b533-b5133622aa03,julia +ec6a6236-142d-4c21-a56c-d8422b709792,julia +9a7192ae-a44d-425b-bba9-1167816f38a4,julia +f6f42abc-8bdb-4d2b-a09b-6753d38906a0,julia +24e8dbfe-1fb4-470d-8b6b-4860bf357b03,julia +e6e70198-2e33-4e5c-9bbd-53a60d660d5c,julia +f10ec91e-074f-4259-ae94-aad780ff31c4,julia +bd75944c-860e-4b31-a1e3-84018d8be963,julia +a8f19613-8067-45c7-a61e-571741ddbd74,julia +dc0fe02a-6300-4654-8269-d1562b77cda2,burningship +718dfabc-a9c0-4da3-87e4-976c173be223,burningship +c6d95f7b-8b11-46ef-863a-c417ec4ddf7b,burningship +1929d92e-8fda-4b54-808b-102ca6762572,burningship +a03c01d6-7d94-4623-aee5-96ea0e4b9496,burningship +535d826e-8ef2-4fa1-aac0-329abf3f1118,burningship +c72255be-0205-40bb-a38e-9496c2e75c35,burningship +348a7eaf-aeae-4318-ae05-03eb7818b597,burningship +3a446ecb-ee5f-4c51-b6e8-51c309af0d9f,burningship +fc8ee55d-d9c4-4b7f-b4c9-4c668f86ea05,burningship +0e065232-661c-4700-a5f7-c21e871e1a0a,burningship +b454b035-dc56-45f1-a97c-ca2a302a2ec8,burningship +5296acba-c564-4968-9975-f341735011c5,burningship +f91135e4-bb92-424e-bd6a-83c52e44375d,burningship +3ccac711-925a-4aa7-9aba-0ceba0ae8c52,burningship +0ad99a0d-7ff8-4d64-b802-b7d5498a4d94,burningship +94601972-f2ac-45a1-b5f9-4e28ac1e62a4,burningship +e626e3b9-6dfc-4955-b178-849fd892c0b7,burningship +c6f8be89-bd03-42cc-a21c-1819b4e1b3b5,burningship +e5e32553-d61b-4a86-a4a7-166b9b0d0c3d,burningship +8a77ef54-1230-4313-a02d-58c82f8fec08,burningship +ea03e964-1bc0-4261-b2e2-40811ee68e3b,burningship +3cc0d82a-aaf5-4324-898c-8ecb132f49d8,burningship +c2535a4b-2452-424f-8e1e-d57d7ef1a251,burningship +b34f74e4-f76a-49bb-9c2d-700e376308d7,burningship +7f45b120-174e-4116-9af2-02483fec7bea,burningship +3474af5c-8b4b-4a8a-bdf4-44fd21a8831e,burningship +afd1029a-221d-4a1d-ac2e-6fb0acac6b28,burningship +e4ad6cfd-5f6b-42cf-9dd9-e5efb6381a65,burningship +1f32c590-3c81-4687-b69f-846856aed707,burningship +507fd933-4d7c-4b77-96ff-80adf19f8646,burningship +b00a9ae3-9fc3-4ea6-b28a-5cd55186e3b7,burningship +eec5cd5e-48ec-4dab-b140-789717970d5b,burningship +43c48da0-f7d5-43a7-bbc3-767e8c0b760d,burningship +b33fd2d0-666e-4b70-a233-b76e18dea10d,burningship +29050350-178b-4953-9f60-4549d1287592,burningship +ea4af22c-6f65-4dbe-9994-615610b79019,burningship +8b4f7291-2a1c-4261-8162-b54ad5c4663f,burningship +62cbc7f0-37e1-4dc8-b9f6-f1429bcb3bb7,burningship +117fb80d-f688-475c-9c82-b490c971a1fe,burningship +45ddb80f-8c04-4709-b863-041a0065403c,burningship +cddc64af-ce7a-4464-a171-130548c527e3,burningship +be92f9b1-a532-420f-a1be-800520effba1,burningship +702f6b16-1b0e-4db1-884d-d1f6e78f189a,burningship +66cc0625-8e4e-4ab5-8210-1df6f17cee1c,burningship +d50a3f13-b17d-40a7-898d-6590b713a1cf,burningship +accf5b76-267f-4390-8ab7-5a1b4fe84769,burningship +2594a531-6e30-4cfe-885e-6245619abd6f,burningship +8705235d-6ac6-4a3a-bbe6-e0c275b510ca,burningship +9e38ab7b-c401-4f29-a952-4bc5ebc7931a,burningship +c6d7e261-ce4e-4bba-ba0d-eff6dfbb9005,sierpinski_gasket +242ad646-1628-4be2-97e0-f80d086a857b,sierpinski_gasket +9a6997fd-bf94-439e-9b50-58ee870ef8cc,sierpinski_gasket +737c4cf6-026a-42ae-9fba-02c2687b5c56,sierpinski_gasket +62f02892-7219-4651-ba1e-8cbdaa6100a8,sierpinski_gasket +143e6157-0ec6-477a-b97a-61ceac70432e,sierpinski_gasket +0f57edd0-84cc-4e29-8257-3e0318f79cc1,sierpinski_gasket +423fcdb6-606f-4e0b-8a39-e1d4075a3211,sierpinski_gasket +dc90e144-c339-4758-bb70-a8e564a9a785,sierpinski_gasket +710eae38-8fd4-498e-a39a-7d33f5377906,sierpinski_gasket +fac774d5-20bd-453f-bbce-f373c965c485,sierpinski_gasket +38e0777f-7c48-4e8a-9d37-186d62a9089a,sierpinski_gasket +ae3afb10-4124-4be4-95a4-197869ea6a1a,sierpinski_gasket +30604b8f-783d-44e0-a904-eb2de1aaafaf,sierpinski_gasket +dd23e4f5-68c9-4de4-acd8-742c37250c67,sierpinski_gasket +62156730-cebd-4f23-9a72-60de3d125469,sierpinski_gasket +e421e10a-ae85-43ed-9639-9bd28e461a33,sierpinski_gasket +c518f08e-9581-4586-8f65-eb75e3baff51,sierpinski_gasket +36951d9e-2315-43d1-ab7c-8875ffca761a,sierpinski_gasket +dadd2b63-f06f-4db3-8de7-776be227b706,sierpinski_gasket +a080cadc-9bb1-46db-9a69-ac474dccc3b6,sierpinski_gasket +78479243-90fe-4451-a724-147b03dbfa65,sierpinski_gasket +95855f4a-3f9a-4970-ad44-6edc115bbe8d,sierpinski_gasket +25fca5d9-feb8-4235-ac0d-eedc3bb79bd9,sierpinski_gasket +19b8bf6b-322a-4fa9-89f5-006aa055412e,sierpinski_gasket +604b0567-6b6d-448b-b56c-a35cf754dc0a,sierpinski_gasket +19144574-d8a8-455d-8979-ec4b19289c3e,sierpinski_gasket +52fefad8-3d6a-4224-b87a-b3aa3fb7c5c6,sierpinski_gasket +8d0f1625-41d5-485c-b68f-88412d3f6b3a,sierpinski_gasket +e891eb1d-ed65-4b15-947f-8a2d8b3354d4,sierpinski_gasket +049ab0ef-75a8-4afd-9d20-a1476151a076,sierpinski_gasket +403b769d-1e88-4819-b065-2a9d2fc5efb5,sierpinski_gasket +48cc5c7f-312e-41eb-b43b-6d7d849cc74b,sierpinski_gasket +bc83f195-171a-42a9-a424-7853db778bc0,sierpinski_gasket +b0984331-f66c-482a-b12b-ca635696ff0e,sierpinski_gasket +63a3cce2-547b-4e59-b856-14d602892787,sierpinski_gasket +8bff36b5-d6c8-46c5-95c6-de13d5db1974,sierpinski_gasket +d1be5694-8113-4998-85a4-cc94cd2721ca,sierpinski_gasket +642b69b7-fc08-40fa-a829-c1640201c608,sierpinski_gasket +e2e33741-ce96-479d-8347-111d99853716,sierpinski_gasket +edcbe2ea-01de-48c1-94ed-c6f05693353b,sierpinski_gasket +bd58f685-caba-4d79-b341-04a9f9d37826,sierpinski_gasket +952289af-3041-40d3-8346-8af07932d9a5,sierpinski_gasket +9997ec6b-f958-49b3-bd98-6a67ad56aee1,sierpinski_gasket +8e2754dc-0525-4b3c-8387-e4386ec92c6e,sierpinski_gasket +d62910c4-1a07-47ae-ba70-6cf4c53066a6,sierpinski_gasket +85f42ee1-6fc8-4ef8-aa37-d244ac932210,sierpinski_gasket +b011d0dc-7a22-4061-80b7-d4f4717a0003,sierpinski_gasket +187a02c4-0d47-420b-8a2e-d204303f43ed,sierpinski_gasket +0d91de60-103d-48a9-80ab-54a5d04d4825,sierpinski_gasket +7244a76b-892f-4869-93c0-5fda182c130c,newton +516d9e14-a370-414e-8859-3273a5be5caf,newton +9a85cf9b-85fc-49bc-b6cd-d6299868b609,newton +cd1e9994-ed0f-411c-8849-735d3e18bc2b,newton +2a2720b8-660a-4e85-b554-19ffe09adf36,newton +ec8c631f-1e7d-433b-88a8-2a67d152f0b8,newton +286052cd-ddc9-4e9c-87ab-1237e37842f7,newton +210e348f-015a-4783-b588-942c9d5fd921,newton +3b8fcf31-adca-4263-a7ae-b63cd04c50e0,newton +2f40baa8-8306-45d8-8010-a6f8fc03181d,newton +0376d3f1-28f3-440e-aa96-6c1a837ac4ac,newton +bb645e58-3d3a-4bde-8d5d-1d7436d078a2,newton +e32999cb-140c-4e48-b7c2-af5a7a04cb67,newton +8656b0cc-9b13-4a0e-9f29-965ac9071c1c,newton +64319c84-045a-4c97-8377-b677cb94208e,newton +223cf596-bd3e-41a0-8c52-e7dddedfca1a,newton +c5947b36-f9d9-418f-a3f2-16dd26440189,newton +b9d16a2d-bce6-46e9-834e-0ac49b00c399,newton +cc55052a-b6ff-4f22-85f9-4753ad738315,newton +dce75e11-6449-4bbe-86ab-562754b0cb8f,newton +dd44ac90-f959-4672-b4b2-d0abb157e4c2,newton +ca66bf83-2916-490c-9b87-d2dd8ca35310,newton +0c646b08-dca1-4116-a227-df5f662b7e3c,newton +fc99152a-1e9f-4250-97ed-5c2e6f521918,newton +71348882-95b0-4367-a97c-7d2cffd35241,newton +424fdcb3-ad7f-4c87-80a3-92a8e9e501e1,newton +4d62ec5b-17de-4a81-9d29-c4c1b1c90214,newton +40246af3-4e0c-429f-9231-f4bf3c6aa584,newton +0593931d-eb0b-4f86-a539-ef462babbccb,newton +defeb91c-895b-46b5-9186-b1a8bfdf9bb1,newton +42f9b150-8f39-437f-8e26-cb5c241d49e6,newton +717f31d9-695d-493a-8660-fe434a996c42,newton +a9fe4dba-a829-4ac3-b667-126dda12bdc1,newton +2037a457-1381-4f53-b545-253dd23cd1c9,newton +e5719917-5858-4e3d-bb0c-ebbfb047cf58,newton +4ff2d637-249d-4f1a-8fa3-08b5f97796fb,newton +e656cfa1-e888-4f44-a76d-582e8e658845,newton +6fc53877-6781-462c-97ed-a3d8a04d2170,newton +8dbdcc58-a1ed-4548-82cd-65c83aeafa22,newton +dc237dbb-2326-436a-be30-3143e6523d6d,newton +7dc3b990-6aaa-4ad3-b944-e6479c0d03a4,newton +fd5e9638-6067-420b-80cd-2d0a998fac61,newton +d3b3ae30-7b8f-4847-9450-7a011a9404e7,newton +fa53b2cf-c7f0-4502-aaa9-e19ce3d38921,newton +d5ece07d-2e33-483d-94de-097e65b8f2ab,newton +1b10ef25-5600-407d-9004-a2296a16ab05,newton +3301b351-3a5c-47b6-90f5-dbcf8dd2ed7a,newton +33dbdc5a-aceb-488b-844f-0735c1e1ab98,newton +daff0dc0-0f6b-40c9-b255-725adab4722d,newton +27a98881-d1c5-4faf-b3f5-6fed75afb537,newton diff --git a/lib/src/test/resources/fractality/test/images.csv b/lib/src/test/resources/fractality/test/images.csv deleted file mode 100644 index e8cd165..0000000 --- a/lib/src/test/resources/fractality/test/images.csv +++ /dev/null @@ -1,121 +0,0 @@ -image,label -f3080922-398b-45d1-830f-1c897ebab78a,tricorn -6470d79f-f55d-430b-9fd2-7687588cf699,tricorn -3b6faf64-c284-421b-82e1-defff8f6dbf5,tricorn -157699a8-a81a-40b8-97b0-fddf61194e51,tricorn -e91f9739-1df5-492f-a75e-621cd3528f5a,tricorn -d8b6aa60-fb95-4a44-937b-6f8cc79da120,tricorn -55fbaca0-c876-452b-b162-b9750f85d79d,tricorn -db16ff25-e871-4632-bf20-ba7635f906e2,tricorn -0e8f2753-3160-4dc5-8080-8654ff8f6ae7,tricorn -3564b36e-5e76-4aa0-936d-b3b10dd8227d,tricorn -de734713-09cd-4625-a8aa-31525460bdc7,tricorn -abace5aa-5620-46ba-aea5-91e98cdc1af8,tricorn -46628591-024b-4e9a-abe7-0dc45e278dd6,tricorn -5a27e662-43a1-4bca-ba20-dac5079c44f4,tricorn -6fb7b091-b349-4fb5-b385-cdb2cf829b63,tricorn -ae3bfd89-2c32-4822-bd9c-c53a62322e80,tricorn -8919393d-d071-4bf3-960c-ac920a7ae603,tricorn -31037598-b391-45bf-b3f6-d7f343d7c790,tricorn -f92c4058-a446-4f62-968a-ed83e25bd14c,tricorn -7f1abe22-4d73-4ee0-9d31-65accb9556a8,tricorn -a39a5142-eb22-47cc-9171-dcfcfd091bae,mandelbrot -a723ba00-9d98-44aa-a596-0d50409915fe,mandelbrot -ecf87efc-4195-4b84-ba83-1b8cf2f4f20d,mandelbrot -4da48b8a-fc00-460b-95a9-593c7c564908,mandelbrot -6a8ee5e9-0eeb-4343-b07e-6929efef064c,mandelbrot -dd274444-0bdf-466c-861f-87176bf95a81,mandelbrot -05c7355c-6053-442c-8853-eff85db071a0,mandelbrot -41719455-76bd-46cf-95ac-32abaaa005ee,mandelbrot -d55599bc-5153-4911-b395-f115c9e1d16f,mandelbrot -fa70ace6-0ffa-4cb2-9bc7-1c95b90cb847,mandelbrot -a105c7e3-5aff-43c4-bf4f-b5223cfcfe91,mandelbrot -78d13544-6552-4abc-a8db-80216e8a2c89,mandelbrot -88caa3c2-1cb5-4999-885b-3ed87286930c,mandelbrot -71e8a242-b432-4d6f-a12b-34a5375d4626,mandelbrot -64588133-878a-457d-a4d7-73bfa10add33,mandelbrot -3aad6321-fef5-4fc9-b98f-3ddcedda1f49,mandelbrot -1d7b6e18-579b-4cd2-b606-13437f2b3e8b,mandelbrot -43af1aa5-2cdd-488f-8d91-3b76df849d9f,mandelbrot -e12f952f-fa07-4d3f-8d98-0f3e1fcef198,mandelbrot -c0518916-f0da-486c-8d9b-1643b376a741,mandelbrot -b38a1110-59f1-49b7-a288-1bb74c9dbe15,julia -92c406a9-94be-4577-8558-709c1881db05,julia -cb17ee00-84ec-4b99-b080-964338922fa7,julia -e85522f2-3317-49ac-b9b2-276eab30071b,julia -f6cd6c77-e108-4db3-8196-cb0fe2d08b78,julia -bd3c637d-c1cf-499a-9222-e9b3fedd9d80,julia -c72bf748-3974-4db6-9eed-04ffaea80f98,julia -5d467802-2cad-4ddd-b8e5-6db87654f699,julia -82c7f303-3c5d-48c6-a6c2-d800ccd3480e,julia -2fd8f43c-418c-4f93-96e2-59a00cabbde4,julia -1617ceb6-9b82-4364-aba0-c0e8aa857b6e,julia -f7dbd74d-8b73-454f-b15c-589ea21a17ac,julia -b136d99d-71d2-4489-808c-c4a3f42629c9,julia -a5de1b8a-7c71-45d9-89e1-17caee80067f,julia -3a8458d5-75be-42f0-8527-7aa41fa9b4f3,julia -9cb8eafe-8b9a-48f7-b9ff-0b57e321e868,julia -6ac4e335-ed85-4b3e-9e91-62031eb6351e,julia -7b12a311-d8f0-4359-9253-f73a425e324a,julia -130ebbb1-deb1-4df3-883f-ff06b756f73e,julia -319089a3-26ea-41eb-8434-4200122f1605,julia -3c1cf4d9-a399-482b-b633-103728740b03,burningship -61b792d7-32d6-4197-b72a-3d9b5067602a,burningship -30f0ab65-0efa-4e1c-9255-d6a68596c167,burningship -6af0ca39-9808-4409-975e-f00893a8d4ec,burningship -64431801-0e60-4e1d-b6c9-9d3e219dc366,burningship -84fd14e1-e57e-4c3e-bab5-612cbb5dc238,burningship -0a5224e3-5b09-4d5e-a6bf-776615b2c4bf,burningship -69c954fb-967e-4121-ae29-8d577c682485,burningship -c6c67a9a-0079-40a1-9448-7ab8e055ab80,burningship -6757fd70-0661-4d83-9629-984f3081cbb4,burningship -c6473931-114d-4369-a359-abd08734f0f0,burningship -4caaeb09-d654-4e8a-82de-d1302059c7b7,burningship -bbeb4c98-c405-464e-8dac-a67384c2cf03,burningship -721342a9-8b25-4f9c-89b9-aca81459414b,burningship -59cc3d7f-aebe-4467-823d-dd7ad3c61abe,burningship -c8820142-20d2-4729-b777-6ccdbc32d47a,burningship -c4bfeecd-d932-40c6-9ea3-475b152233d1,burningship -7ccbd209-89ac-4ac6-91f1-6bb43b451b5b,burningship -e4a44430-018a-4b84-9851-1cac47fff8ba,burningship -f0734909-8847-49e5-a407-ba0178222e7c,burningship -33de1e43-6c81-4092-80cc-e6efb2a7c71b,sierpinski_gasket -fb6de425-6ce8-4d55-add5-7f669649f604,sierpinski_gasket -3cdd48f2-0224-4e3b-833b-0f8442ab3411,sierpinski_gasket -7c09b65b-16c3-4d62-807b-1299af476513,sierpinski_gasket -f073ec60-f2c5-4090-a416-230f8447030b,sierpinski_gasket -b8e74c8a-a00a-448e-99dc-4fae1a102e1a,sierpinski_gasket -421e1016-8db1-4006-a09c-c7c33ee1a057,sierpinski_gasket -e7983811-70c2-4dc6-bc3e-057a3e31471e,sierpinski_gasket -c1ca5428-2cb1-41dd-911b-efea6c1b7659,sierpinski_gasket -d9675f25-7bac-4841-b35f-eede874ad280,sierpinski_gasket -85d617c5-bd55-4a18-98a7-5983ce810117,sierpinski_gasket -0e5e8d7e-c984-4aab-ab2d-e9ceec505aff,sierpinski_gasket -f0255fe7-c782-4598-8df3-76d3a780dffd,sierpinski_gasket -ac78f348-a5a3-4cd5-9e2a-27edb8ae75a5,sierpinski_gasket -e3d8da66-845d-42ca-8361-a6dd8fe149d8,sierpinski_gasket -1621534e-1945-4945-93b3-a8db7bf7c16d,sierpinski_gasket -10e745c4-14be-4a3c-84e7-a37370e7363f,sierpinski_gasket -175a204d-6223-476d-ba6c-9bfd3ccceb4f,sierpinski_gasket -17b189f4-7d8b-44b2-9d66-77d3208c210a,sierpinski_gasket -89a180c6-3f89-42d9-8219-dba3e100cc86,sierpinski_gasket -455237e4-26b4-4961-880e-645f26aee863,newton -665678db-1f52-4780-a81f-4be1bd2e3301,newton -2b52dcf9-b491-45cf-9adb-71f21d39e6ea,newton -44437199-c272-4a2e-8f6c-a1ae321168b5,newton -aacd5a3e-5e57-4250-91a0-e6a0d9e1d83b,newton -01243f47-658c-48ab-aba3-e99c193a22d6,newton -b6931dd4-3714-412e-93f2-dd9f42705dd5,newton -4345753b-3958-4e12-9c15-ed0a7dbbc4dc,newton -e4a6328a-85b7-4f4a-a05f-1e24c1327f84,newton -8ff14127-365a-4478-9575-34df051c4c01,newton -650fb63c-7c41-4f02-8bc2-ce8f0541ae91,newton -c189265d-1903-429e-a78f-c2916d4544d2,newton -7b9f2656-299e-439f-9f53-16cd08d1c174,newton -7d2170e5-9025-4e2f-8b9a-36129ee8c9ed,newton -cdef4073-420e-44e2-9be2-2882199bef81,newton -99488c27-35e8-49c7-af7b-e39e96b939c2,newton -12f99c37-6b43-490c-a2f1-6ed7de0e8a09,newton -f7af4a3e-bae0-42db-beb0-e30dfe8e2e58,newton -2d260a47-05a6-4c59-bdb9-71d90163607c,newton -7e0c41b6-55c3-4dc6-a375-ab5d8d9bea61,newton diff --git a/lib/src/test/resources/fractality/train/images.csv b/lib/src/test/resources/fractality/train/images.csv deleted file mode 100644 index 6799349..0000000 --- a/lib/src/test/resources/fractality/train/images.csv +++ /dev/null @@ -1,600 +0,0 @@ -image,label -8c1a5f9b-f637-431f-9c71-24dfdd5bee84,tricorn -82337da9-8eaa-4c58-b0c7-6ce8c29adec7,tricorn -a5653571-9c95-4c99-a8ed-d16326383bbd,tricorn -86332140-2447-4e8e-a7ad-2a6119d6e8cf,tricorn -ddaf575c-6554-456d-a373-9cafd580d8da,tricorn -5ae6be53-455a-417b-b37d-4c6a5de852b6,tricorn -67de5f90-fe3d-4783-b810-e3afedd126c2,tricorn -d02882a5-2d84-4448-90b3-17cc3b14e025,tricorn -d84c168d-b814-4892-9d24-ba355078adcb,tricorn -68909607-a7f7-42b3-8cde-ac57fc184a05,tricorn -22a37a1d-ad80-4505-9ce7-2fc16ea16162,tricorn -6345b719-047d-4e70-af2d-4c664332dee7,tricorn -b5b5b6ae-b0e0-4fe8-b16e-00ec3a05c45f,tricorn -fc60e7e8-e5c5-4d3e-85fd-ccaf3412a9cc,tricorn -6fc69a0b-74a7-47ae-bd8b-14be452916be,tricorn -b8a86509-dee9-4b5a-b923-e0e7e55402e1,tricorn -f3484617-5de6-4029-8129-36fe477d8662,tricorn -aeee27b8-9d5c-48d2-9d82-ba9557f39e12,tricorn -d9d455d5-2b6f-4031-9e97-9c63f96a2b24,tricorn -09762164-cee0-42c0-be58-e10c9bda185f,tricorn -7cbee46d-70af-4f37-8f14-f76e039d7976,tricorn -2acc1e7c-2952-4edc-bd67-d960063807df,tricorn -7b26d687-b831-4050-b620-0012cfe2d2b4,tricorn -59e46e97-39ac-4a79-b5f3-7d212416d347,tricorn -9d6f3a10-d42d-4aa8-a200-240def28ccdb,tricorn -1832dd01-dfc9-43b8-a361-27302a44e9d5,tricorn -7713ef0c-c3a4-43f8-90a1-45be0c989bd2,tricorn -e4dd2e96-83b9-49bc-bca3-a73cd275853e,tricorn -bfe3b4ed-980b-4f32-af62-d7fa0d57095e,tricorn -8c6ee0d2-b90c-4f27-90e1-048eee50c3ae,tricorn -6c5e5742-ad78-4b65-922b-15b29b7c8a0a,tricorn -e9cef493-ff73-48a9-a828-45f7337a9514,tricorn -0e3b0310-5352-4bc2-9f70-3e463fe4f776,tricorn -d8e816de-d2d8-42b9-b038-0d21f745e74d,tricorn -b6eb1a4d-c554-42f6-a0cc-88e24d9729c8,tricorn -c034eddb-4f0f-4448-96b2-ccf7550e61e1,tricorn -6b2ab918-3183-4369-b010-58610069d0c7,tricorn -4d26399d-2010-4686-ae73-691a2c8b2378,tricorn -b35774e2-67b7-41c4-848c-31b1e9b29fcc,tricorn -3eb133de-e918-4c89-b43f-39a8ed1a561f,tricorn -90a6e5c5-efec-44aa-9d96-118def1076a9,tricorn -1b7abd07-2415-47ad-8217-c0512edc70a9,tricorn -289e74f7-e35b-44fd-b3c1-1288ef3bc781,tricorn -0ebd8aa6-c579-4cfe-85ab-0b6fc9dac085,tricorn -8239a2d9-d030-4649-b893-74f5d770d0cc,tricorn -1fb6bf47-f501-4864-bf16-7ababa46428c,tricorn -827d0b8f-481c-4b3c-85c1-6f166a2c4faa,tricorn -06ca4c87-b42a-46d6-82cb-d16a7af024ea,tricorn -0946b47b-a839-4275-96f7-a0838231c62a,tricorn -9cea0760-6b18-4660-a191-ff81f9784b8f,tricorn -689aacef-3fce-4b00-a898-91a8edbefff0,tricorn -3d1f1b4e-d70b-4525-aa5d-4844c58cd6a4,tricorn -0593781c-e226-4872-be2c-4ca03e1e9af4,tricorn -d72651de-255b-48c4-ad21-e24a10b1c118,tricorn -ccebe960-ac42-404a-a290-5029558c6af6,tricorn -820fe220-d42e-44c8-ae7a-61876be59639,tricorn -3710f232-bf65-4599-a428-a82a0ea974ea,tricorn -caeab843-f7b7-4e40-bd24-d0b6371323d6,tricorn -65ec548f-2ea6-4084-b460-65ac8fce5bcd,tricorn -769b3fa4-ae40-4d2e-b7b2-accc8b865d66,tricorn -8a309afc-ead8-4fc0-813d-8baaf2ec8c39,tricorn -3622b4e6-f577-4a07-8ca2-aed2efa3c54e,tricorn -e59cae40-5f14-4845-be7e-7a8b6ebe1a3c,tricorn -50996c35-1a71-4244-adf7-a4d7e761e5e1,tricorn -17e119e0-b168-4a19-846f-f67b20f4c1f0,tricorn -e18c97ae-df86-49a0-b719-ad0230fc8f60,tricorn -5533ec9e-eb89-48b1-a791-015d5048d32b,tricorn -64f96260-de26-475a-adaf-0487f59af671,tricorn -da9cbcde-6f50-44a5-94c7-8b5631e45272,tricorn -8518c329-be81-44aa-bf7f-ac5b483852d7,tricorn -0e526b98-57c4-42e0-8862-5257c2e2a4bf,tricorn -5a163818-d1ce-4f1c-9961-a8c12b6c866c,tricorn -7dab4106-da8c-49b5-b5da-9184d02cf82c,tricorn -718ad663-8434-4f70-bb0e-db1c8f954e6d,tricorn -00b12886-5a25-4099-ac1c-234f333bcbe9,tricorn -b87bba1b-8eeb-486f-abca-1563179aff19,tricorn -d85a4878-08c3-4b60-b566-3ece77f63ac1,tricorn -98c35eeb-fc16-4d26-a4cb-bdae0df2d561,tricorn -058f399c-7d1d-4eb1-8dbc-0c3e888c0f00,tricorn -b23f2cff-569a-4ea3-8f92-e5ecad549770,tricorn -e91d9659-a4f7-4dc4-b852-f5f47f8b9802,tricorn -41b66fb4-1074-4ac4-ae78-5953220a55cd,tricorn -20fdfdde-9451-4a06-8280-2b9ca01c8fb3,tricorn -8ffb9d01-95ab-4b67-b173-47d5925d1c6f,tricorn -96a29e4f-14c8-413b-83e0-706dbb9ccc39,tricorn -ff3e1c5a-e90f-4aab-b4f3-69eaf174c83c,tricorn -3eb1387a-9be4-48e4-99bb-3859e9d3e917,tricorn -85c236f5-53f6-4027-9ea1-36d9bf5d6805,tricorn -b8a71a36-eb3f-467f-bc68-d2b76d3fff98,tricorn -3bce1ec8-7dfe-412c-a72c-79c200907f85,tricorn -0cb39ea3-2d0d-4995-9203-7a770501518f,tricorn -06b26682-5b31-41ba-842c-d927b2c00ba0,tricorn -5fe76099-b7ed-4722-8ade-14f0d197234e,tricorn -59f01bd5-4d15-431e-b1c7-20cb16794977,tricorn -a792ebeb-f25d-463a-a7fa-83756bbedb12,tricorn -59e3bd3b-bdd9-4267-9759-0c1d81ae339c,tricorn -60e6446a-a37f-4456-bfd4-d155865902cb,tricorn -43cc0f3c-b092-4ce9-8bac-e91d8945fa64,tricorn -47667ca4-7efd-47e2-99c9-dfbd18d77ded,tricorn -a195c0d5-d3a3-4c7a-ab10-c720521a4c5b,tricorn -bec05ebd-0de7-49f5-8145-49da680bc191,mandelbrot -a33c0245-0b21-4ca4-a849-74f2832e9d4c,mandelbrot -58a417de-cfa1-4a4c-bcbd-b40097278e2d,mandelbrot -002fbfed-3ee6-41ef-9196-dc1f2f319d2a,mandelbrot -be5ec8ca-ab5b-42f8-b5d1-03d51d930aa4,mandelbrot -3e112a38-269b-4423-b9e8-781f5ff0fe67,mandelbrot -31dbc736-4549-4fbf-9d0c-8a2a6687d77e,mandelbrot -6b84d3e4-684f-41ca-bd1c-bb492a1b1690,mandelbrot -6bc3b748-ef79-4fc6-bb3e-ad2ba06f3f7d,mandelbrot -44fa2df7-339a-4bbb-ba85-56ff226781f7,mandelbrot -81790a5c-af1b-47bb-ab4a-5ba8875b4b87,mandelbrot -a23ba153-0e12-4a27-847a-6665fa1d68d3,mandelbrot -e4bb6ed0-3b2e-4961-a313-0bbee0172f46,mandelbrot -e9e8aabe-f570-448e-b0fe-953643353866,mandelbrot -3562d06a-3646-4ef8-a9fd-7ed5cdefeb91,mandelbrot -2de981f3-d323-4def-9a65-287735d31675,mandelbrot -99b405da-70a2-4f85-bd96-646b669100f4,mandelbrot -5cb84174-3945-444c-a901-d095b82cc62d,mandelbrot -f28a76db-a518-42a8-8969-17f54ad8db33,mandelbrot -afda8e65-9d62-457b-835d-ffff89db668c,mandelbrot -ca66450f-aab0-40bf-9ab8-5f4e5b383b16,mandelbrot -82a4b499-0e3b-42b5-895e-782dea3c8a8f,mandelbrot -ff929603-1587-4369-aeed-e8370fc0bf96,mandelbrot -42554b02-89da-47bd-b428-70dfab8a20d4,mandelbrot -341728e2-bc14-48d3-b711-c33b3c25c100,mandelbrot -5e4bf7ff-cc96-4340-ab47-9e19948352d7,mandelbrot -58302761-bf6b-4934-b978-bb686f07bed2,mandelbrot -167ee17b-9249-4722-9b78-d784f0b7f9df,mandelbrot -87690c29-ab45-4197-990a-e95e97c1f102,mandelbrot -3eaa76f2-28f2-4146-ae2c-eedcacc369b6,mandelbrot -c17e8423-8bf4-4a1f-80dc-6163984537c5,mandelbrot -5a82f5c7-d738-4f13-b222-ef561d1db79c,mandelbrot -c801f049-d4f2-46bf-ac13-7e1a1d836400,mandelbrot -1886f079-1ae7-4cd0-9d7f-7de5902780ab,mandelbrot -2a9924f8-6bca-442b-9a43-287b2bbf7388,mandelbrot -7d255e57-e751-44be-aa90-b2dd3c2a0fc8,mandelbrot -f55292ba-301b-4b51-b545-882eea52b110,mandelbrot -df547c78-4c45-4423-9bdc-2638ebfa272d,mandelbrot -5025a2e5-7e7b-4d25-969a-c22804876a4a,mandelbrot -9d92ac9d-d5b2-4982-b1da-9d3dcb6f2228,mandelbrot -531232be-3fce-4987-808d-bd78eb1cb5aa,mandelbrot -8e81f45c-53f6-4b74-a833-cd1cb634250b,mandelbrot -36babc18-0d93-492a-9595-a84d3c6d7f47,mandelbrot -7c11ee6c-bd3c-4276-a22e-2831d3e3755f,mandelbrot -d9397b9c-562e-471f-92e3-044efcf35ecc,mandelbrot -5384bb89-0a0d-401f-8738-829efd9f0ac2,mandelbrot -199bec6d-19cf-4148-84a1-44e76229b7ca,mandelbrot -a197c97f-52aa-4c04-a683-5493445be634,mandelbrot -dfe90910-4e1a-4aa6-9989-eebef5322c5b,mandelbrot -bda65e72-5f29-43d3-b564-04765614d451,mandelbrot -839fe35b-8273-482d-a5b1-7005b63b98ad,mandelbrot -c54d66d9-1a2d-48fe-9219-cc09e7027a77,mandelbrot -9d3afe43-82e8-4245-a894-0e79f51fb76a,mandelbrot -0828ca48-f228-436b-936c-97f26d494c53,mandelbrot -217c8cb3-9868-40cf-aa4c-8ee0d1bfa662,mandelbrot -160f14f0-2dc7-4206-a7ef-6bc0721e1c69,mandelbrot -f9def7bd-b7dc-4a9b-9a7a-92ac0eb31e73,mandelbrot -12b31330-dd43-4d4e-ba03-2f380107ccce,mandelbrot -24c4304f-296a-484a-be31-2990e42b7404,mandelbrot -436ebc63-8212-4704-90f6-3c43099a2397,mandelbrot -5bd455fd-6dbe-406f-b9b3-50bfe01ef2bf,mandelbrot -0f219716-3d53-4d52-bf21-86c80b7f585a,mandelbrot -15766e32-7ae4-498a-9c45-7d1756a4e9d7,mandelbrot -1c68d68d-70a7-416b-a82a-e3832fcac5ac,mandelbrot -9eedf607-bc04-48dc-ae9c-2f1039cc9ca5,mandelbrot -6d2c28ab-c482-43ae-87be-2f97099d583c,mandelbrot -136d7ca9-8b31-4841-9140-3ffdcb39b099,mandelbrot -aee98066-be6b-4135-b341-d45190a40bad,mandelbrot -c1c36b16-1228-46dd-b463-c13c4eb67752,mandelbrot -dbc5f804-87c6-4ade-9ef2-fdbb4a6160f3,mandelbrot -67d3e4c6-7149-4d4e-8905-44ae20f0624f,mandelbrot -084bb6ba-dca2-4746-9e65-2908441da93a,mandelbrot -7d8299d6-3874-4169-a7b0-8f10a8087d97,mandelbrot -ae18f000-89b0-4443-885b-57dad28a2530,mandelbrot -d6f5db22-334f-4efe-a146-d3aaacc447ac,mandelbrot -b0afd9e4-599c-4c7d-a7b0-f71bdcace2f9,mandelbrot -df6b8ef9-16f2-43d0-90da-32bb2a928027,mandelbrot -c334b0d2-7aa6-43d9-83d5-fa50e9a6480a,mandelbrot -8dd28b1d-e4b7-4549-ae37-8c18e5ec0a44,mandelbrot -657956ef-66ea-45a0-a9bd-24c76cae2326,mandelbrot -2dfb8a68-096f-4a97-91bb-ec750d791326,mandelbrot -c9be7439-f7ed-41ce-8d76-242760cf2e0a,mandelbrot -3cd6b4b4-c3a0-4385-bc2b-b5f4fb660cbf,mandelbrot -f9953d30-40fd-4c5e-b64a-e42ae3b601fa,mandelbrot -030965b3-5176-4e23-8566-eb4ea83f72c2,mandelbrot -5454dceb-b9d3-49c4-ace7-5269c89cc8f7,mandelbrot -fd5572f8-66f1-4523-8c0c-65d9a82a201e,mandelbrot -e3891f09-e39f-474d-a879-1b70ca2e7bf0,mandelbrot -0b266ee7-a496-49b9-a1f8-ca7086d69a78,mandelbrot -a9c00ff9-75dc-48bd-bdae-056de4338e76,mandelbrot -5535e1f5-d8a0-4eab-a5ab-c5decc58c573,mandelbrot -3cc07fa5-a83e-4e9f-93ed-f12bfa7140b8,mandelbrot -8c211ae4-00f9-4212-bee1-4f43b0c855a0,mandelbrot -d3facfc0-0e6e-4c21-ba38-d1351c03b9e3,mandelbrot -2f602457-063e-455f-8ffb-20789fbfbdcf,mandelbrot -c899cd61-15d7-481f-a0a4-93ab7dcb7a55,mandelbrot -0e8aa4da-913c-4dba-8162-774d32e7fb24,mandelbrot -0b624bfa-780c-48de-af0e-4bb6d42b3344,mandelbrot -14ec5dba-3295-40c5-9414-e9ce369abc00,mandelbrot -1864d893-831a-466f-8c78-3e2122487922,julia -80860573-9f8f-43dc-adca-e49485bf3422,julia -d6fc279d-e1ed-4837-be77-621eb805c019,julia -544beb14-249a-4aba-896e-72914e386042,julia -950ccabf-62d6-4f42-8462-a9f61c1d6eb0,julia -9a1c26e0-dd9c-46ef-a0cc-ad94220ed722,julia -8959ed7a-aff8-4f2d-b771-0a7a5c05a555,julia -3be6b692-2c3d-44c6-9826-e0d21a9c75bc,julia -aa2a5504-6c04-4f95-88e5-690610cbfe83,julia -cf9a2ffb-6ca2-40cb-8c4d-07d6ff6680be,julia -ae81a298-0921-4ff8-b935-9fceadcc0d01,julia -5b20583e-6520-4b2a-9b53-4e319c109245,julia -beca34f8-4fec-4462-b4b6-b9e23866ee97,julia -6f82007c-17e0-43b8-939f-6e642a11c970,julia -76e3bbf8-089f-43f6-adbc-029688bd947a,julia -5806a400-1037-486e-84a5-f3b8926c7931,julia -ee9f9e6f-6769-46bd-af2b-e576cdbdc56f,julia -309dab98-3ac3-4e6b-b34a-334104328e2c,julia -f37ae9a2-1022-4ec8-b9ca-d62550c4f23c,julia -8433d8dc-f10c-441c-b0e4-477ea618bd99,julia -2a0723b3-dd17-4add-90b1-0c3c49935c52,julia -b002d890-f12c-4693-b26b-b4d75b4c7ba0,julia -8bee23c5-bd25-45c9-ad48-18a1667c29d6,julia -111da9e2-c869-4378-bd39-e3d4128074ce,julia -ffba4ac0-b4e4-4844-881a-5345895ccc7d,julia -e4b09098-49de-4be8-a287-0e7e286531a1,julia -bf849bc0-726e-4258-adab-7f7be2ce0a3b,julia -f64c5c90-9666-493d-9ac8-9ebf74b725a3,julia -04687592-685b-4321-833c-da5349db514a,julia -db295a6e-fe79-4021-91e0-d153d7c9f792,julia -eeea4360-825a-472d-ac32-31d7e66d9def,julia -c6d0111c-a427-4a74-a75d-410b77eb3dd7,julia -ef7e608c-bf96-493a-a0cf-3543101d0bb5,julia -22ddaec9-9b84-4256-b64a-f26ff130b025,julia -60d0899f-1711-48bf-b2cc-bd6d7f8e27d4,julia -4b29c860-f036-4c74-89b0-ee534a20aa7d,julia -1e74a978-18e2-4b3c-bd89-79a5bf30e429,julia -b75309e4-8fb2-482b-8683-07fd4c1a1ab4,julia -3b0da231-1f38-4b4f-a23a-c545106a3f66,julia -ee8079a2-05f4-4b93-b8b4-606abc7bab49,julia -d3cdcebf-ee25-42d5-9077-05cc3592b4e6,julia -dd42f0c6-4b38-4314-8338-149805ccd9eb,julia -27235d94-2de3-4c5b-a16b-ce4d7c2b7f4a,julia -a3e7b95a-e66c-4358-8041-936b345ec742,julia -7591531d-037d-4bac-974d-c3c049d16398,julia -29ef6830-d320-4400-b3d2-515e73d4670e,julia -5d7281ec-c9a6-4a79-bd5c-dc84549db826,julia -089b3813-e22d-46c7-be26-980a3d53de65,julia -98576043-ab8a-4cfe-b72a-c355beea1a55,julia -ef6cf5f7-1986-4b8d-9847-04892ba2c377,julia -56333e61-83db-4cb3-9a57-e64a80902cfc,julia -2b184f98-365e-42c1-81db-348b638a8a70,julia -26e6dea1-03fe-4122-ad0d-78b4dd5cf4d3,julia -49625de6-7bec-4b98-bfb1-b80e7084c5b9,julia -4ebac2e9-aa09-4b7b-a876-6ab8495955d1,julia -a5d927ed-5ece-4bc8-b4b0-692e693c3cfe,julia -12ea3437-e610-42ae-96f2-0b8221e44295,julia -9fd7ff5a-d3dd-4e1d-819b-d87b54095279,julia -82094db6-2cce-4992-a2c3-79828332e6aa,julia -e0441bae-89db-4fa9-9b5c-6ef5e0dc24d9,julia -087af3f6-8832-44d5-91ee-90802a1249a5,julia -ea6116c4-797c-44ec-b6df-ea02ef73f7f9,julia -97575896-8d1e-4be4-974c-9c86bd22696f,julia -f5623b9b-c1e6-47df-a094-ae9200d4de20,julia -115b2363-9c58-4bd4-a589-1cc8b2c98560,julia -92191228-682a-40f9-b840-ec2df7bfe7a5,julia -76cf8c16-11cb-48f5-9826-231ccd8e3e46,julia -1f4b5ed6-622c-4d1b-aff4-6eed04633e1b,julia -b378e75f-c0c7-4f53-af9e-8ddbca862a92,julia -8c446c22-3fc8-4d31-84c5-748c0f1400d7,julia -3ae17a20-c5e6-4ca3-b26f-151f676a6812,julia -dd5a9915-6eb8-4a1f-a075-06d6076afb6e,julia -844342e9-9aa8-49b6-ac22-ef35c7038337,julia -6bee4fb2-a9b4-475a-9dfb-d4fa3303d946,julia -48e12e73-b5d6-4731-b2ac-875b5d55267c,julia -466f2c20-bb79-4c8e-945d-a25d6561614c,julia -906a8f26-4d84-4a86-b552-2f4d7f91a195,julia -3defc920-7495-4978-a50d-bfac56a0d8b6,julia -c294b050-0cab-40a6-b869-efde08a83cbb,julia -383aa246-8116-44b9-bd17-503ea72f1210,julia -46917145-bc5a-4208-a0ca-1ee745c5fc54,julia -60b01beb-17bc-4a62-9f58-e69966f67052,julia -570cabf3-7ccc-41bc-a4ce-a5172f53dc4e,julia -580d3197-f723-4bf4-ac5a-5840e0206d26,julia -acc55d07-0d4f-4e73-9d68-c2f9b84092ca,julia -e25e1d90-a10a-4176-8d45-18b3a2027006,julia -c0dabe49-ba3b-4f48-b86d-59927ef73797,julia -b12ae1d6-2723-4413-bdb6-3a2cc523a46c,julia -ad12445d-de90-4a9e-abb8-19c3a7ee4dfc,julia -93321dd6-d970-400f-9448-c85255d1caaa,julia -f2afc059-efc3-47ac-97e6-b727b6da1ac0,julia -c9d5665c-093f-42e5-963a-63abd8c99b7a,julia -a54b267c-e521-4bc9-af32-1a8b5fcf0ec8,julia -c253250c-882c-4e85-8a4f-b97ce7182363,julia -162acfd1-ef33-418b-93f3-40ef4a23ac4c,julia -4959b1cd-b3dd-4beb-acd2-b1b3cfd6e639,julia -2145d36f-5a0f-4eeb-bd5f-4f1d18cbc7f2,julia -09ad79a4-1fef-4aef-8222-ff60259734cd,julia -c2a53bf0-5b60-4512-8f15-5315acce09df,julia -46a88391-18fd-4f87-bbd7-5599c2e458a9,julia -09823041-d25f-4e90-bbbc-e6a919c5562c,burningship -7c0f7b61-7e85-4c38-aafc-51a9f91b2ce3,burningship -12abfc34-231a-41d7-b62c-f4658962f7bb,burningship -25e24133-9baf-4a10-a179-f19e145fb9bf,burningship -5b71efa8-e44b-441d-9aa1-6bc1dafd845a,burningship -5e235c18-2f25-423e-96fd-e0fbd19f5aed,burningship -2e189879-75d2-48e4-9bb8-f3c8c56ab870,burningship -a387445b-432e-4e98-9ace-40fcbf03ce46,burningship -a662066c-a5e2-4f04-a860-57b2c00d03db,burningship -15cecb58-5026-4221-8334-36003387e0cf,burningship -399b3ae5-56a4-4bc5-bc4b-abc429a47904,burningship -fa52207e-38cd-4d29-8761-15d808cf7038,burningship -8fa8d69e-ab60-4784-9e31-fc921cc5e65f,burningship -d1b0f0d5-564f-4706-8804-ece8a185a085,burningship -34fe8d22-fde3-43b5-b284-e6009d954cd7,burningship -d8d65616-91c0-4255-9aba-1d0ba28de305,burningship -160c4b6a-1aef-4753-ad48-073ce1df953f,burningship -1d34cacc-8c3a-48c7-8319-02b2385eda98,burningship -8287dae8-a43d-4c20-b176-659af7c009a5,burningship -003ad781-aa29-4ebe-8a6b-46715dfd173f,burningship -4fe48488-30c8-484f-bf95-f9b9717f85da,burningship -1f5757a5-ffc4-45a4-ac48-f7cb62b13cca,burningship -37d05b81-ccb4-4a32-94ed-fce658dacc98,burningship -ddbb450d-a6d0-4c48-b34e-a0b28e497d60,burningship -905443d9-a51c-4fdf-934e-1b643ff9c3a6,burningship -83ff433d-53b9-40a8-99cf-7e00e7fda1be,burningship -74503679-7039-4c1a-a00e-697ca4b5bddf,burningship -e38590d4-df39-438c-ae69-733ba8e7e7fa,burningship -1c2e010d-b0c9-431f-8305-6de071d684e1,burningship -6dd53755-4595-4a2e-9ee0-15ade1c15232,burningship -b6f327f0-6ba1-409b-94aa-d1552a330b17,burningship -4696507a-6c67-4dad-96a6-c1da58454c1f,burningship -738887c2-7014-4d7d-a3c5-c0c2b896834a,burningship -e15429cf-1c51-4cb3-a92b-75a0eef7fdaa,burningship -a8dbf3e9-6333-4e37-aabe-e022a22b989a,burningship -3ad2220f-ac6d-42c7-b62f-bc6413a6e75f,burningship -788d7339-0e74-437d-b38b-83c39b2167ae,burningship -e306610e-c6e6-48ab-8b67-4924a166b6c1,burningship -4280773d-ce0d-49ba-bb6e-8c285a8e2a45,burningship -cb464c4a-c412-4d5f-bdd8-3514e371b13c,burningship -653aaaec-80d8-4c42-840e-01e220ddcfbd,burningship -72aa0b4e-cbb7-4572-94a8-bf6130cf8e60,burningship -4da3737d-958f-4dc1-90ef-c9f9be07e6fa,burningship -5f50a500-e219-4a6b-8647-40e4ad9bc918,burningship -0ebfdc20-afff-4f43-8f4d-f8c5322c0534,burningship -de384a7f-7eda-49e4-a697-540ec1520d84,burningship -aa9bb433-5d6b-48ae-bae8-6d55a006094e,burningship -817526ca-b2d6-4c26-9574-32608ee23299,burningship -04ab639e-1dc8-4b73-a40d-c9201ad508c5,burningship -0eb3bb03-dfa5-437a-b5dc-1586c44e618f,burningship -6f73cef6-9ea3-4122-ad6e-28e6cc6fb855,burningship -000fcbb2-8c3c-419d-a4ae-ce2a1f9a70c9,burningship -74acc379-e640-4a94-b90e-8969c02148c4,burningship -e95b3178-31c3-4956-946b-f86ef949c615,burningship -3462c3b2-325a-4964-a323-aece6fb800f6,burningship -6f072a74-8eaa-48a5-a9b3-e20a342c4542,burningship -8f88a176-4cb5-41d4-b8d4-0742eacd3588,burningship -d6694286-77b5-4366-82ea-5a0aeeb7b274,burningship -43e5fbb3-305a-417b-a852-4c4b7c68e2fb,burningship -e0b155d7-75e3-47c9-acc4-daddc6fff687,burningship -9d59397f-64cd-4be7-8640-463670c816ed,burningship -3102aab7-57a1-4cde-92aa-bf752e3f4c1f,burningship -edc90676-518b-4e4c-a95a-4ef1cdf87822,burningship -f70bfb49-1f89-4b55-8641-e938c3cf17a4,burningship -222ad824-b0d0-4050-bcd2-9c3d83933bfb,burningship -66ad8099-1d44-44dc-8b4d-8cae8da07ecc,burningship -e222fa57-6511-4716-a734-70aa7c3c74ee,burningship -171908a3-e2b1-46c8-8f9f-af4ce4b056b1,burningship -5a914183-ce57-475c-b665-ba67eeb5ca28,burningship -02bfe57c-2baa-47a5-a0f8-f881efe2d72d,burningship -350bca01-8d79-4de2-b478-4289924f363c,burningship -4cb87483-6c57-4acc-89f4-8f26c83c7537,burningship -c1000901-0544-4163-bf11-c856626491e0,burningship -25d2385e-1517-4ac0-9450-a83a791aeadc,burningship -22d5b649-56df-4bb8-8a96-048ac251155a,burningship -b62a3131-5cd2-4267-8df2-3503d688e7dd,burningship -c530eb09-1d36-4598-8c74-1738a7627f19,burningship -e0913a47-f10a-4ef5-9af8-bf76be62fc9c,burningship -141a929e-50b3-4bf9-9a36-2ee01001f34e,burningship -9c53d0dd-e280-4da2-bc9d-ddb8b8830458,burningship -fbfab0c1-2204-4c5e-9b32-4b99f484b772,burningship -dc63e82b-0cb0-43d3-9f19-c0b301c95c09,burningship -ac125103-386e-4e5c-a904-45faf51e2744,burningship -665ab838-5dc6-4f37-b6ce-384f74dd314d,burningship -bd00486a-2eca-4838-946b-b0d9b4d838fa,burningship -8746481a-85a9-4845-9c86-c33d6c97c70d,burningship -cbd7f726-4375-4b05-840d-35546b87404d,burningship -6c62888f-5f42-4780-a2c4-74f698b6bcc0,burningship -4ed952ea-dfb3-4cd0-bc08-cb7ae6fe8d32,burningship -49fb5281-c971-49ac-a814-8a44eaefaeda,burningship -dbe40feb-03dc-45b2-9936-c64bad55ef7f,burningship -761196f8-b5e5-48f6-ae20-fba0af459837,burningship -a86402e5-7e6b-4baa-b321-43f12e7f3ee6,burningship -670c5941-32e5-4c14-9d00-58c3c0e4ca29,burningship -328dab3f-20f1-49b0-a77b-0aa65920526d,burningship -5f522173-27dd-44a2-a763-d99dc37af0ba,burningship -365ba4fb-4ab8-41e9-927e-48809447154d,burningship -2311381a-7bdf-4a77-b8f5-f895ab7ab285,burningship -a92fded1-15e8-48a8-a595-566f8c2d6bf8,burningship -a9ed73d0-74be-49ae-8cd8-4286fd76adfa,burningship -bddd5a6b-d4c9-42b4-a81e-af44e1dafb3e,sierpinski_gasket -93e5daea-4e8c-4c58-a197-b142b82b8bef,sierpinski_gasket -0659e479-f257-4518-ae2f-a04cb65526d2,sierpinski_gasket -8dc6161c-a42c-414f-8bcc-a72b92d1a331,sierpinski_gasket -23987b64-7746-427c-ad50-3c8ef41a7052,sierpinski_gasket -78253ed2-ef6c-411a-bf34-3d5c7dcf9234,sierpinski_gasket -2dd0d6d5-f820-4fd4-88ba-b98166907e1e,sierpinski_gasket -52ecc900-990d-4572-a9f5-dd9af7b0328b,sierpinski_gasket -4ed0d51f-fd71-4f7a-8c8d-89fc40d44fde,sierpinski_gasket -ca656d8a-41df-44ee-9b3b-a9abe3588f10,sierpinski_gasket -f33e6af5-ae2d-4300-a6be-64159b39f8f9,sierpinski_gasket -7c89dedd-5324-4664-aaeb-cd5e95faeb95,sierpinski_gasket -7eae8c16-d066-4539-9480-1aa84c35fe27,sierpinski_gasket -359af845-eb9b-4c4f-912c-9b14041caa22,sierpinski_gasket -6416bdd4-d346-4cce-92db-c6de6b9dd8a6,sierpinski_gasket -a5291f8a-0a8d-4018-9dfe-df0da778fa83,sierpinski_gasket -389ccdbb-4252-48c0-923a-3a1033a0b22e,sierpinski_gasket -bb1ca164-8538-4826-919c-e5adcea0a1de,sierpinski_gasket -d0a8fc52-6a8c-49df-9644-c393400ddb33,sierpinski_gasket -90ba7a24-f68b-432f-8039-d8c8109ef5b5,sierpinski_gasket -54f8938d-fde4-4183-bf02-6d738507e76b,sierpinski_gasket -217185e2-fdd3-46b3-b027-e22f02f21a1c,sierpinski_gasket -121451e9-ea7c-42b2-a85e-d7ba336daabe,sierpinski_gasket -7fc52e52-49b7-4c63-b8c1-36446942ef88,sierpinski_gasket -7dbec653-e894-45d9-b62d-83b6e96322ee,sierpinski_gasket -06aae3ee-f90c-4cef-8c42-6443832ed398,sierpinski_gasket -98d9d203-8808-4e7c-9c2c-974c043e332b,sierpinski_gasket -f8daa069-3e55-4fc2-9731-d780e1e7e5d6,sierpinski_gasket -d619dccb-1eba-4613-af5b-e552c6f44fef,sierpinski_gasket -9c3f2a2f-dd5d-4373-92b1-a140b6765e52,sierpinski_gasket -c8ddefc0-aca2-4013-8576-8d5ea7d6da04,sierpinski_gasket -766e81c9-a071-490b-aa86-d4599f820e2e,sierpinski_gasket -d1d6c2d3-8a4e-41db-814a-e81c93eac508,sierpinski_gasket -b3ff9ed2-d1ea-4ab8-8e86-5568c87ea97a,sierpinski_gasket -aaca0f48-ca1b-4d53-970b-42b98072b373,sierpinski_gasket -f331d563-f2d0-4a6c-838a-497e5756782c,sierpinski_gasket -56302c82-7377-4536-a2f7-596ce7ad3c01,sierpinski_gasket -178b9394-0f75-47cf-b832-274760bc049c,sierpinski_gasket -9948a554-e7cc-4059-95e2-26ea41f2fb79,sierpinski_gasket -ad1fa400-aedd-4b0d-8bd3-b40dad7ab91a,sierpinski_gasket -1baf70d1-a99f-441b-b40a-6a45d7252c78,sierpinski_gasket -8c001d36-5a6b-4dc0-bc5e-00a925ea59ff,sierpinski_gasket -36f28300-93ab-4f1a-bb7f-156c2439759a,sierpinski_gasket -9570bd0a-c864-4437-8962-7dc96eb32f79,sierpinski_gasket -774630e7-129a-4d57-901b-b4b23853336d,sierpinski_gasket -ffff2d64-f15d-4ef9-a80f-16a07c4473b7,sierpinski_gasket -41545155-c67c-4fe8-a0ec-a3c9c4c93c03,sierpinski_gasket -8a657d5d-dc30-4917-8ac5-fd62668f8946,sierpinski_gasket -7df71824-cd48-4601-b6e1-79040b451d8d,sierpinski_gasket -ce5bdd11-3a95-4106-9f24-c97aaa4339a3,sierpinski_gasket -00b2e735-694d-4396-a12b-3678c9646792,sierpinski_gasket -97529bc0-661a-47be-b572-ded716d790e5,sierpinski_gasket -d696d50a-74e0-4b09-a760-e33c85096a44,sierpinski_gasket -bbd81a78-131d-4c81-973b-cef23159afe8,sierpinski_gasket -9ec3386c-bf28-464f-b9ca-355781062bc1,sierpinski_gasket -6303f728-0c2e-483f-a3eb-736c8963a5d1,sierpinski_gasket -316e8d6a-5399-44d5-9c72-cd2d7073f3ff,sierpinski_gasket -7d31ed8f-d3ce-4702-b45b-0c43d20ebab7,sierpinski_gasket -b50ae033-24a3-4cc1-a4b1-318e75143248,sierpinski_gasket -8ca084d3-8f23-4bc9-861a-c688f170e9ca,sierpinski_gasket -0ae5fb83-42a3-47fa-b40d-5e748c31c88c,sierpinski_gasket -64c73cfc-2c2f-4817-adeb-8c8d3f68c484,sierpinski_gasket -56c8a44f-21d0-42e6-869b-ba0b0f9048a5,sierpinski_gasket -066df258-fc78-46f6-90d4-63ed19d06c83,sierpinski_gasket -feed4d73-8c90-422c-be51-c81e328b8be3,sierpinski_gasket -97014e3b-8e1f-495e-85ef-d119e6639169,sierpinski_gasket -5e7c14fe-720c-4072-bdbf-b3adddb83e88,sierpinski_gasket -f2689242-dc2c-4705-9f5e-2101a0c1f812,sierpinski_gasket -2d2bc776-9be2-4728-a2a2-b5cdce11330b,sierpinski_gasket -dfd6b6c9-7183-417b-ac8b-3acfda9353e5,sierpinski_gasket -ee942a00-75ee-48be-a682-f1703e2ffe68,sierpinski_gasket -4d7e2ed6-ec16-447e-b905-5a1cf871e1c8,sierpinski_gasket -1b2f76a3-ea29-4aa8-b068-650c3fdbc8f6,sierpinski_gasket -4495622c-1f74-4bba-865e-0ac0c68a74a6,sierpinski_gasket -7a111681-c44e-482d-a708-984bf494182a,sierpinski_gasket -17d37956-71c0-46ec-b06b-2791b99d8e21,sierpinski_gasket -8abc96f7-2e1a-498e-bcca-6b7ad6b45a47,sierpinski_gasket -7f484935-6d5f-4377-b973-60eceb6061de,sierpinski_gasket -872e03a9-6e70-418d-935b-2629a842eac7,sierpinski_gasket -c2caf305-95e3-4bac-95e5-f8880abf7305,sierpinski_gasket -150c5c96-c0c8-46e4-bba8-869cbf9c9326,sierpinski_gasket -a7870d22-7289-4d2c-acd7-3a4aadd136e6,sierpinski_gasket -cf497c3b-bb34-4737-a289-71217889f6f5,sierpinski_gasket -2a83a7e1-2b18-41e9-8951-3c1e6ce5ec42,sierpinski_gasket -9d92f99c-e680-4123-9325-c192a487c138,sierpinski_gasket -bb9c6a84-fb88-4cf7-bd5b-7228d6fcda30,sierpinski_gasket -054d9514-5e7a-48d9-a06a-fe67624c7f18,sierpinski_gasket -1bf77fc6-94fa-4cf8-8b32-8580c2501523,sierpinski_gasket -37eaeb5c-56b0-4bd3-9271-331ad37f95f1,sierpinski_gasket -a4b930be-14d1-4895-921f-deff1a238ffd,sierpinski_gasket -14106715-4774-44ca-b2e1-6a09d52fea90,sierpinski_gasket -06d8bfa8-3b9a-4640-9a8b-83b9a2e14963,sierpinski_gasket -50fb1fef-a7c0-4ba6-817b-52be97154ea5,sierpinski_gasket -9c668930-22bf-44c1-a26e-4d6b376f70cf,sierpinski_gasket -c477667b-633f-4a57-baa5-8cebc7abf493,sierpinski_gasket -8588d949-bb74-422e-999c-ae0adc2b96ba,sierpinski_gasket -8d2d829a-1a7f-434b-aebc-daa59cf07b8b,sierpinski_gasket -08b1ad2c-8d2c-4a12-806f-aacb07f9c22e,sierpinski_gasket -e484661b-a4de-4c02-be1f-7acb051f5e42,sierpinski_gasket -4d199db3-88f4-4e96-8841-a0f61711a3e9,sierpinski_gasket -3f3a6969-8983-4b0c-8f17-8d8aa3581c9b,newton -2d5a5c1d-3620-4b4a-a930-9453c8a99678,newton -9c73f641-2eb4-48b1-978d-9a9cd4df7c99,newton -9e4491f5-77c6-4822-a60a-d16edf3c42d8,newton -0b6fbcef-d176-435c-90cd-7e7f9430faec,newton -99b80ea6-85fb-4bac-9ff5-e8164745a1e0,newton -dfcf72a2-907a-4560-93b6-0b321f4e2263,newton -8ce888ba-2a3c-44e9-8742-139de8ae2aed,newton -9e3a06af-3484-4efa-81c6-536e655a3014,newton -185c203c-3c41-47a0-a066-00ba0808c432,newton -549991c0-93fa-43bf-8496-87a8ef150822,newton -9b610962-2f2d-48f9-be89-f46640332fe3,newton -2d382ab8-8541-461e-89d5-3ca7f2656eb7,newton -a8a9eed2-8170-4955-ad32-f8e6affc9d70,newton -77c72f80-15eb-40d7-a1c0-cb351dbbce6f,newton -fdd4dc6e-7b3c-49e0-9185-48f8f1dd7e6f,newton -8f725a04-36d9-404b-a94b-a462016c1f1f,newton -632d71a6-a98a-4203-a605-f27daa8b5bf0,newton -e5f2d79b-4a64-4498-a3a1-87fbb3873f47,newton -f96bc733-6bf9-4fc0-8504-fb7c3f2133b7,newton -d7828f78-7eb1-4a6a-8495-98272f21b4d7,newton -82a8aecb-d6d1-42ae-8c10-12b8322f53be,newton -025519b9-84cd-467e-ab96-a540c5c2815b,newton -68288502-1eb3-4fc2-9703-fca999ed810c,newton -d43aa286-7a10-4448-85f7-a066193952af,newton -5b022ecb-ea1b-43f5-8d04-6e7e2a02bca5,newton -18a7e861-eece-4d10-959d-2f98a0728408,newton -042ccf30-68da-4263-946d-b015a1fa7a69,newton -053b6141-00be-4d65-865a-46478c05b7ea,newton -06e33817-f04d-4653-8231-1d2a37c7a557,newton -22f17bbd-58af-481a-b56e-d1fe26a5ed86,newton -cdd67eb0-9f34-44d6-99a3-fdf5ae44dbf0,newton -f5b45eaa-8dc3-4e29-b111-66648cb85891,newton -f08a6588-1dfb-444b-8000-00461b36422e,newton -d9c23596-bbb4-4e8b-b7db-5a3e6f5a998f,newton -aa29d040-abdf-445f-b988-ae209d1fc8b6,newton -60667d46-33dc-4054-9d40-9cd68418503a,newton -7f24397e-4769-4ff8-830d-790ec4feeda6,newton -519f6d23-705c-47f6-92a3-049a53f0c488,newton -bb0427c6-339b-48a0-987e-6fc0ca5a8f8b,newton -b0cfd962-db6e-44f7-8ab6-623c6f41e6b9,newton -cb6ee1f9-db2d-4b47-a13e-bbcd5ab20fc7,newton -d408e174-eb16-43a4-b3f7-675ae0e3831d,newton -c4adc903-2b46-4cd6-b061-402bf5121542,newton -6ddb4333-94db-4708-b496-98137c3c503f,newton -0d613d07-24d2-45e2-8fa0-645b97284e2a,newton -390f38f7-443f-4cf6-b789-68e37176a310,newton -5d2202a4-4b15-414a-9b29-e676392ff2bd,newton -d552b720-8712-462a-a8ff-8fe1e595bef3,newton -57a89080-16cb-4cd8-91e7-7e072e7130b2,newton -3fff9a74-ede3-409f-971c-337dc280345d,newton -58ab0f88-44f9-475f-8092-49d1109dd53b,newton -cf6718e8-7eaf-49a8-afec-aebce6b75c49,newton -ebe939dc-cb00-4647-be80-97a9d32a5221,newton -dc180d3b-53a1-446a-8a2e-aca762a08cc9,newton -c46ffbb1-1844-4a17-a224-28fbe9c18f7d,newton -ff00ec62-8862-42af-a1fb-b0d582e9b822,newton -2fa8dd0a-4cf7-4842-8b5a-4af7c8695a75,newton -cd152cdc-c6e1-4ad3-9684-8bc0add33077,newton -fb317d5c-b964-420c-b199-701565e170e2,newton -0375737d-b08d-4298-a157-9a767297c77f,newton -51ffe12f-5989-4211-a048-ad7469378042,newton -7e2866c5-3727-4c64-8583-1d2576fb4b49,newton -8053a128-6d39-499e-a9eb-bfb69f652229,newton -fb50aa08-5156-467b-8699-34851749faef,newton -4a7903c1-14c3-45e5-8c43-39a807c0ca69,newton -d443f1f3-6590-438f-8064-8df69f8a9046,newton -36615030-3ae3-4c50-8c3e-037607487d52,newton -021c74a1-0799-4d5c-a2d1-e0511153d178,newton -6ec1ba63-b038-4753-b39e-3f63e7c1ae2b,newton -b46b43a1-39a3-41f9-95ca-de1751f815c2,newton -24315e2f-0926-4a13-8747-f19ebbe39223,newton -c7a3a65a-6568-4360-b1a8-a342855f8ead,newton -ba60622b-c20b-45ff-9898-bde23cd58ced,newton -0ec35b37-5986-4bbe-83de-586d3f4d6b55,newton -688a8946-409a-4129-ba71-fc54f89e63c5,newton -298e8077-5ae2-45f6-8583-656038ad69a8,newton -a3db4c14-d5ba-470c-bb4b-e0aa68c8253f,newton -7890fee0-92c5-41ec-b095-c771e2d84bf8,newton -eeefe620-71d9-4d12-aea2-b45c721d676b,newton -1aabf1d9-c71b-43b2-a98c-69301b35527e,newton -de0f25ac-2285-44d5-8e74-1de5b1ef69b3,newton -3af8ec5b-d34e-4665-a2bb-7fe9e188aa02,newton -d5f815eb-6312-433d-bb5d-34b40187c349,newton -7023523e-58cf-4c42-b4b7-3244a1d93e21,newton -b56398fe-08fa-40e3-b6ea-6676276e0f76,newton -c7574b2b-8796-4055-8d49-b8e10dc5239e,newton -777e9b1f-f160-48b7-a39b-9f63372d332e,newton -79f2dd6f-97de-4c34-a90d-2ea4dd5d9a56,newton -8b46a268-ec40-4db3-b824-3552ed86bb6b,newton -8d145241-dd91-4b57-b580-831436365e41,newton -3e89fe9b-7457-4740-b602-6a15f18bd27a,newton -cbfaab3f-4348-4ec9-a81f-104b95ab4353,newton -1abfcba0-f849-433b-a0cc-3f171f92dd76,newton -2c3a1412-6409-4133-9c40-b82681edc614,newton -ea3dbf33-92b9-40ce-84e5-a4a6f4cb8cc1,newton -d63c627a-cff3-4c19-9d14-a806d0908fc8,newton -2113f358-96d0-4ace-a717-f4e0cd6c4677,newton -bf02e534-8c78-4e2e-8983-91bd4255bf6a,newton -c034ed38-358a-445f-a5f6-0474d92b9959,newton