/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.matheclipse.core.stat.descriptive.summary;

import java.io.Serializable;

import org.matheclipse.core.expression.F;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.core.stat.descriptive.AbstractSymbolicStorelessUnivariateStatistic;

/**
 * Returns the sum of the available values.
 * 

* If there are no values in the dataset, then null is returned. *

*

* Note that this implementation is not synchronized. If * multiple threads access an instance of this class concurrently, and at least * one of the threads invokes the increment() or * clear() method, it must be synchronized externally. *

* */ public class SymbolicSum extends AbstractSymbolicStorelessUnivariateStatistic implements Serializable { /** */ private long n; /** * The currently running sum. */ private IExpr value; /** * Create a Sum instance */ public SymbolicSum() { n = 0; value = F.C0; } /** * Copy constructor, creates a new {@code Sum} identical to the {@code * original} * * @param original * the {@code Sum} instance to copy */ // public Sum(Sum original) { // copy(original, this); // } /** * {@inheritDoc} */ @Override public void increment(final IExpr d) { value = F.eval(F.Plus(value, d)); n++; } /** * {@inheritDoc} */ @Override public IExpr getResult() { return value; } /** * {@inheritDoc} */ public long getN() { return n; } /** * {@inheritDoc} */ @Override public void clear() { value = F.C0; n = 0; } /** * The sum of the entries in the specified portion of the input array, or 0 if * the designated subarray is empty. *

* Throws IllegalArgumentException if the array is null. *

* * @param values * the input array * @param begin * index of the first array element to include * @param length * the number of elements to include * @return the sum of the values or 0 if length = 0 * @throws IllegalArgumentException * if the array is null or the array index parameters are not valid */ @Override public IExpr evaluate(final IAST values, final int begin, final int length) { if (test(values, begin, length, true)) { IAST sum = F.Plus(); for (int i = begin; i < begin + length; i++) { sum.add(values.get(i)); } if (sum.size() > 1) { return F.eval(sum); } } return null; } /** * The weighted sum of the entries in the specified portion of the input * array, or 0 if the designated subarray is empty. *

* Throws IllegalArgumentException if any of the following are * true: *

*

*

* Uses the formula, * *

	 *    weighted sum = Σ(values[i] * weights[i])
	 * 
* *

* * @param values * the input array * @param weights * the weights array * @param begin * index of the first array element to include * @param length * the number of elements to include * @return the sum of the values or 0 if length = 0 * @throws IllegalArgumentException * if the parameters are not valid * @since 2.1 */ public IExpr evaluate(final IAST values, final IAST weights, final int begin, final int length) { if (test(values, weights, begin, length, true)) { IAST sum = F.Plus(); for (int i = begin; i < begin + length; i++) { sum.add(F.Times(values.get(i),weights.get(i))); } return sum; } return null; } /** * The weighted sum of the entries in the the input array. *

* Throws IllegalArgumentException if any of the following are * true: *

*

*

* Uses the formula, * *

	 *    weighted sum = Σ(values[i] * weights[i])
	 * 
* *

* * @param values * the input array * @param weights * the weights array * @return the sum of the values or Double.NaN if length = 0 * @throws IllegalArgumentException * if the parameters are not valid * @since 2.1 */ public IExpr evaluate(final IAST values, final IAST weights) { return evaluate(values, weights, 1, values.size()-1); } /** * {@inheritDoc} */ // @Override // public Sum copy() { // Sum result = new Sum(); // copy(this, result); // return result; // } /** * Copies source to dest. *

* Neither source nor dest can be null. *

* * @param source * Sum to copy * @param dest * Sum to copy to * @throws NullArgumentException * if either source or dest is null */ // public static void copy(Sum source, Sum dest) throws NullArgumentException { // MathUtils.checkNotNull(source); // MathUtils.checkNotNull(dest); // dest.setData(source.getDataRef()); // dest.n = source.n; // dest.value = source.value; // } }

Ads help maintain this website.