/* * #%L * org.gitools.matrix * %% * Copyright (C) 2013 - 2016 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.matrix.transform; import org.apache.commons.math3.analysis.function.Logit; import org.gitools.api.matrix.*; import org.gitools.matrix.transform.parameters.DoubleParameter; import org.gitools.utils.aggregation.MaxAggregator; import org.gitools.utils.aggregation.MinAggregator; public class ScaleFunction extends ConfigurableTransformFunction { public static final String LOW = "Low"; public static final String HIGH = "High"; private Logit logit; private DoubleParameter lowParameter; private DoubleParameter highParameter; private double min; private double max; private IMatrixLayer<Double> resultLayer; public ScaleFunction(IMatrixLayer<Double> resultLayer) { super("Scale", "Returns the Logit transformation"); this.resultLayer = resultLayer; } /* * (low-high)(x - min) * f(x) = ----------------------- + a * max - min */ @Override public Double apply(Double value, IMatrixPosition position) { Double low = lowParameter.getParameterValue(); Double high = highParameter.getParameterValue(); if (value != null) { return (high-low) * (value - min) / (max - min) + low; } return null; } @Override public void onBeforeIterate(IMatrixIterable<Double> parentIterable) { IMatrix matrix = parentIterable.getPosition().getMatrix(); IMatrixIterable<Double> matrixIterable = matrix.newPosition() .iterate(resultLayer, matrix.getRows(), matrix.getColumns()); max = MaxAggregator.INSTANCE.aggregate(matrixIterable); min = MinAggregator.INSTANCE.aggregate(matrixIterable); } @Override public ScaleFunction createNew() { return new ScaleFunction(resultLayer); } @Override protected void createDefaultParameters() { lowParameter = new DoubleParameter(); lowParameter.setParameterValue(0.0); lowParameter.setDescription("Low bound"); addParameter(LOW, lowParameter); highParameter = new DoubleParameter(); highParameter.setParameterValue(1.0); highParameter.setDescription("High bound"); addParameter(HIGH, highParameter); } @Override public String getName() { return super.getName() + " to [" + lowParameter.getParameterValue() + "," + highParameter.getParameterValue() + "]"; } }