<commit_before>package br.com.dbsoft.util;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.List;
import java.util.Locale;

import org.apache.commons.math3.distribution.NormalDistribution;
import org.apache.commons.math3.stat.correlation.Covariance;
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
import org.apache.commons.math3.stat.descriptive.moment.Variance;
import org.apache.commons.math3.stat.descriptive.rank.Percentile;
import org.apache.log4j.Logger;

public class DBSNumber {
	protected static Logger		wLogger = Logger.getLogger(DBSNumber.class);
	
	public static Locale 		LOCALE_PTBR = new Locale("pt", "BR");
	
	//------------------------------------------------------------------------------------
	/**
	 * Subtração.<br/>
	 * ex: substract(1,3,5,2) = 1 - 3 - 5 - 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return
	 */
	public static BigDecimal subtract(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.subtract(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}
	
	//------------------------------------------------------------------------------------

	/**
	 * Adição.<br/>
	 * ex: add(1,3,5,2) = 1 + 3 + 5 + 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal add(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.add(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}
	
	//------------------------------------------------------------------------------------
	/**
	 * Multiplicação.<br/>
	 * ex: multiply(1,3,5,2) = ((1 * 3) * 5) * 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal multiply(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.multiply(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}	
	
	//------------------------------------------------------------------------------------

	/**
	 * Divisão, com a quantidade de casas decimals limitada a 30 caracteres.<br/>
	 * ex: divide(1,3,5,2) = ((1 / 3) / 5) / 2<br/>
	 * Divisão por <b>zero</b> ou por <i>null</i> retornam <i>null</i>.
	 * @param pCasas Quantidade máxima de casas decimais
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal divide(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				BigDecimal xD = toBigDecimal(pX[i]);
				//Teste para evitar exception di division by zero
				if (xD.compareTo(BigDecimal.ZERO) != 0){
					xX = xX.divide(xD, 30, RoundingMode.HALF_UP);
				}else{
//					wLogger.error("Divisão por zero:" + xX.toString());
					return null;
				}
			}
		}
		return toBigDecimal(xX);
	}

	//------------------------------------------------------------------------------------

	/**
	 * Exponenciação (pX ^ pY).<br/>
	 * Números acima de 16 digitos poderão ter os digitos mais a direita ignorados.<br/>
	 * Valores nulos zerão considerados como <b>zero</b>.
	 * @param pBase Base
	 * @param pExpoente Expoente
	 * @return Resultado
	 */
	public static BigDecimal exp(Object pBase, Object pExpoente){
		Double xX = toDouble(pBase);
		Double xY = toDouble(pExpoente);
		return toBigDecimal(Math.pow(xX, xY));
	}
	
	//------------------------------------------------------------------------------------

	/**
	 * Exponenciação com base e (2.71828182845904)
	 * Números acima de 16 digitos poderão ter os digitos mais a direita ignorados.<br/>
	 * Valores nulos zerão considerados como <b>zero</b>.
	 * @param pBase Base
	 * @param pExpoente Expoente
	 * @return Resultado
	 */
	public static BigDecimal exp(Object pExpoente){
		Double xBase = 2.71828182845904D;
		return exp(xBase, pExpoente);
	}

	//------------------------------------------------------------------------------------
	
	/**
	 * Logaritmo Natural
	 * @param pX Valor que se deseja retornar o Log
	 * @return Restorna log do pX
	 */
	public static BigDecimal log(Object pX){
		if (DBSObject.isEmpty(pX)){
			return null;
		}
		Double xX = toDouble(pX);
		return toBigDecimal(Math.log(xX));
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Rais Quadrada
	 * @param pX Valor que se deseja calcular a Raiz Quadrada
	 * @return Retorno da Raiz quadrada de pX
	 */
	public static BigDecimal sqrt(Object pX) {
		return toBigDecimal(Math.sqrt(toDouble(pX)));
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Média de uma Amostra
	 * @param pAmostra
	 * @return Retorna a média da amostra
	 */
	public static BigDecimal average(List<Double> pAmostra) {
		Double xMedia = 0D;
		
		if (DBSObject.isNull(pAmostra) || pAmostra.isEmpty()) {
			return toBigDecimal(xMedia);
		}
		
		//Calcula a Média da amostra
		for (Double xValor : pAmostra) {
			xMedia = add(xMedia,xValor).doubleValue();
		}
		xMedia = divide(xMedia, pAmostra.size()).doubleValue(); 
		
		return toBigDecimal(xMedia);
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Desvio Padrão de uma Amostra
	 * Equivale a fórmula STDEV.S do Excel
	 * @param pAmostra
	 * @return Retorna o desvio padrão da amostra
	 */
	public static BigDecimal desvioPadrao(List<Double> pAmostra) {
		Double 				xDesvioPadrao = 0D;
		double[] 			xArray = new double[pAmostra.size()];
		StandardDeviation 	xSD = new StandardDeviation();
		if (DBSObject.isNull(pAmostra) || pAmostra.isEmpty()) {
			return toBigDecimal(xDesvioPadrao);
		}
		for (int xI = 0; xI < pAmostra.size(); xI++) {
			xArray[xI] = pAmostra.get(xI);
		}
		xDesvioPadrao = xSD.evaluate(xArray);
		
		return toBigDecimal(xDesvioPadrao);
	}
	
	//------------------------------------------------------------------------------------
	
	public static BigDecimal distribuicaoNormalInvertida(Double pNivelConfianca, Double pMedia, Double pDesvioPadrao) {
		Double xResultado = 0D;

		NormalDistribution xDistribution = new NormalDistribution(pMedia, pDesvioPadrao);
		xResultado = xDistribution.inverseCumulativeProbability(pNivelConfianca);
		
		return toBigDecimal(xResultado);<commit_msg>PIDiameter<commit_after>package br.com.dbsoft.util;

import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.List;
import java.util.Locale;

import org.apache.commons.math3.distribution.NormalDistribution;
import org.apache.commons.math3.stat.correlation.Covariance;
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
import org.apache.commons.math3.stat.descriptive.moment.Variance;
import org.apache.commons.math3.stat.descriptive.rank.Percentile;
import org.apache.log4j.Logger;

public class DBSNumber {
	protected static Logger		wLogger = Logger.getLogger(DBSNumber.class);
	
	public static Locale 	LOCALE_PTBR = new Locale("pt", "BR");
	public static Double 	PIDiameter = Math.PI * 2;
	public static Double 	PIDiameterFactor = PIDiameter / 100;
	
	//------------------------------------------------------------------------------------
	/**
	 * Subtração.<br/>
	 * ex: substract(1,3,5,2) = 1 - 3 - 5 - 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return
	 */
	public static BigDecimal subtract(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.subtract(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}
	
	//------------------------------------------------------------------------------------

	/**
	 * Adição.<br/>
	 * ex: add(1,3,5,2) = 1 + 3 + 5 + 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal add(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.add(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}
	
	//------------------------------------------------------------------------------------
	/**
	 * Multiplicação.<br/>
	 * ex: multiply(1,3,5,2) = ((1 * 3) * 5) * 2<br/>
	 * Value <i>null</i> é considerado como <b>zero</b>.
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal multiply(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				xX = xX.multiply(toBigDecimal(pX[i]));
			}
		}
		return toBigDecimal(xX);
	}	
	
	//------------------------------------------------------------------------------------

	/**
	 * Divisão, com a quantidade de casas decimals limitada a 30 caracteres.<br/>
	 * ex: divide(1,3,5,2) = ((1 / 3) / 5) / 2<br/>
	 * Divisão por <b>zero</b> ou por <i>null</i> retornam <i>null</i>.
	 * @param pCasas Quantidade máxima de casas decimais
	 * @param pX Sequencia de valores
	 * @return Resultado
	 */
	public static BigDecimal divide(Object... pX){
		BigDecimal xX = BigDecimal.ZERO;
		for (int i=0; i < pX.length; i++){
			if (i==0){
				xX = toBigDecimal(pX[i]);
			}else{
				BigDecimal xD = toBigDecimal(pX[i]);
				//Teste para evitar exception di division by zero
				if (xD.compareTo(BigDecimal.ZERO) != 0){
					xX = xX.divide(xD, 30, RoundingMode.HALF_UP);
				}else{
//					wLogger.error("Divisão por zero:" + xX.toString());
					return null;
				}
			}
		}
		return toBigDecimal(xX);
	}

	//------------------------------------------------------------------------------------

	/**
	 * Exponenciação (pX ^ pY).<br/>
	 * Números acima de 16 digitos poderão ter os digitos mais a direita ignorados.<br/>
	 * Valores nulos zerão considerados como <b>zero</b>.
	 * @param pBase Base
	 * @param pExpoente Expoente
	 * @return Resultado
	 */
	public static BigDecimal exp(Object pBase, Object pExpoente){
		Double xX = toDouble(pBase);
		Double xY = toDouble(pExpoente);
		return toBigDecimal(Math.pow(xX, xY));
	}
	
	//------------------------------------------------------------------------------------

	/**
	 * Exponenciação com base e (2.71828182845904)
	 * Números acima de 16 digitos poderão ter os digitos mais a direita ignorados.<br/>
	 * Valores nulos zerão considerados como <b>zero</b>.
	 * @param pBase Base
	 * @param pExpoente Expoente
	 * @return Resultado
	 */
	public static BigDecimal exp(Object pExpoente){
		Double xBase = 2.71828182845904D;
		return exp(xBase, pExpoente);
	}

	//------------------------------------------------------------------------------------
	
	/**
	 * Logaritmo Natural
	 * @param pX Valor que se deseja retornar o Log
	 * @return Restorna log do pX
	 */
	public static BigDecimal log(Object pX){
		if (DBSObject.isEmpty(pX)){
			return null;
		}
		Double xX = toDouble(pX);
		return toBigDecimal(Math.log(xX));
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Rais Quadrada
	 * @param pX Valor que se deseja calcular a Raiz Quadrada
	 * @return Retorno da Raiz quadrada de pX
	 */
	public static BigDecimal sqrt(Object pX) {
		return toBigDecimal(Math.sqrt(toDouble(pX)));
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Média de uma Amostra
	 * @param pAmostra
	 * @return Retorna a média da amostra
	 */
	public static BigDecimal average(List<Double> pAmostra) {
		Double xMedia = 0D;
		
		if (DBSObject.isNull(pAmostra) || pAmostra.isEmpty()) {
			return toBigDecimal(xMedia);
		}
		
		//Calcula a Média da amostra
		for (Double xValor : pAmostra) {
			xMedia = add(xMedia,xValor).doubleValue();
		}
		xMedia = divide(xMedia, pAmostra.size()).doubleValue(); 
		
		return toBigDecimal(xMedia);
	}
	
	//------------------------------------------------------------------------------------
	
	/**
	 * Retorna coordenada a partir do ráio e percentual do arco. 100 = 360.
	 * @param pRadius
	 * @param p2PIPercentual Percentual o valor ((Math.PI * 2) / 100);
	 * @return
	 */
	
	public static Point2D circlePoint(Point2D pCenter, Double pRadius, Double p2PIPercentual){
		Point2D xX = new Point2D.Double();
		xX.setLocation(DBSNumber.round(pCenter.getX() + (pRadius * Math.sin(p2PIPercentual)), 2), 
				   	   DBSNumber.round(pCenter.getY() - (pRadius * Math.cos(p2PIPercentual)), 2));
		return xX;
	}

	/**
	 * Retorna centro a partir da altura e largura
	 * @param pWidth
	 * @param pHeight
	 * @return
	 */
	public static Point2D centerPoint(Double pWidth, Double pHeight){
		Point2D xCentro = new Point2D.Double();
		xCentro.setLocation((pWidth / 2),
			    			(pHeight / 2));
		return xCentro;
	}

	/**
	 * Desvio Padrão de uma Amostra
	 * Equivale a fórmula STDEV.S do Excel
	 * @param pAmostra
	 * @return Retorna o desvio padrão da amostra
	 */
	public static BigDecimal desvioPadrao(List<Double> pAmostra) {
		Double 				xDesvioPadrao = 0D;
		double[] 			xArray = new double[pAmostra.size()];
		StandardDeviation 	xSD = new StandardDeviation();
		if (DBSObject.isNull(pAmostra) || pAmostra.isEmpty()) {
			return toBigDecimal(xDesvioPadrao);
		}
		for (int xI = 0; xI < pAmostra.size(); xI++) {
			xArray[xI] = pAmostra.get(xI);
		}
		xDesvioPadrao = xSD.evaluate(xArray);
		
		return toBigDecimal(xDesvioPadrao);
	}
	
	//------------------------------------------------------------------------------------
	
	public static BigDecimal distribuicaoNormalInvertida(Double pNivelConfianca, Double pMedia, Double pDesvioPadrao) {
		Double xResultado = 0D;

		NormalDistribution xDistribution = new NormalDistribution(pMedia, pDesvioPadrao);
		xResultado = xDistribution.inverseCumulativeProbability(pNivelConfianca);
		
		return toBigDecimal(xResultado);
{'fraction_non_alphanumeric': 0.2490410767835972, 'fraction_numerical': 0.014505893019038985, 'mean_word_length': 2.067379679144385, 'pattern_counts': {'":': 0, '<': 83, '<?xml version=': 0, '>': 73, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3393355', 'n_tokens_mistral': 5377, 'n_tokens_neox': 4734, 'n_words': 1123}