/*
 * Zorbage: an algebraic data hierarchy for use in numeric processing.
 *
 * Copyright (c) 2016-2021 Barry DeZonia All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list
 * of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright notice, this
 * list of conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 * 
 * Neither the name of the <copyright holder> nor the names of its contributors may
 * be used to endorse or promote products derived from this software without specific
 * prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
package nom.bdezonia.zorbage.algorithm;

import nom.bdezonia.zorbage.algebra.G;
import nom.bdezonia.zorbage.algebra.RModuleMember;
import nom.bdezonia.zorbage.coordinates.CoordinateSpace;
import nom.bdezonia.zorbage.data.DimensionedDataSource;
import nom.bdezonia.zorbage.sampling.IntegerIndex;
import nom.bdezonia.zorbage.sampling.SamplingIterator;
import nom.bdezonia.zorbage.type.real.highprec.HighPrecisionMember;

/**
 * 
 * @author Barry DeZonia
 *
 */
public class ComputeCoordinateBoundingBox {

	// do not instantiate
	
	private ComputeCoordinateBoundingBox() { }
	
	/**
	 * 
	 * @param data
	 * @param min
	 * @param max
	 */
	public static
		void compute(DimensionedDataSource<?> data,
						RModuleMember<HighPrecisionMember> mins,
						RModuleMember<HighPrecisionMember> maxes)
	{
		HighPrecisionMember mn = G.HP.construct("1");
		HighPrecisionMember mx = G.HP.construct("-1");
		HighPrecisionMember tmp = G.HP.construct();
		int numD = data.numDimensions();
		mins.alloc(numD);
		maxes.alloc(numD);
		for (int i = 0; i < numD; i++) {
			mins.setV(i, mn);
			maxes.setV(i, mx);
		}
		CoordinateSpace cspace = data.getCoordinateSpace();
		IntegerIndex idx = new IntegerIndex(numD);
		SamplingIterator<IntegerIndex> iter = GridIterator.compute(data);
		while (iter.hasNext()) {
			iter.next(idx);
			for (int i = 0; i < numD; i++) {
				tmp.setV(cspace.project(idx, i));
				maxes.getV(i, mx);
				mins.getV(i, mn);
				if (G.HP.isLess().call(mx, mn)) {
					maxes.setV(i, tmp);
					mins.setV(i, tmp);
				}
				else {
					if (G.HP.isLess().call(tmp, mn)) {
						mins.setV(i, tmp);
					}
					if (G.HP.isGreater().call(tmp, mx)) {
						maxes.setV(i, tmp);
					}
				}
			}
		}
	}
}

@@ -2203,54 +2203,417 @@
 %09 * 
-%0A%09 * @param data%0A%09 * @param min%0A%09 * @param max
+Compute the bounding box of the coordinate space of a DimensionsDataSource. The%0A%09 * complete set of the data source's dimensions are transformed using its%0A%09 * CoordinateSpace and a bounding box in transformed coordinates is computed.%0A%09 * %0A%09 * @param data The data source of interest.%0A%09 * @param minPt The computed min point (as a rmodule/vector).%0A%09 * @param maxPt The computed max point (as a rmodule/vector).
 %0A%09 *
@@ -2719,17 +2719,18 @@
 ber%3E min
-s
+Pt
 ,%0A%09%09%09%09%09%09
@@ -2767,18 +2767,18 @@
 ber%3E max
-es
+Pt
 )%0A%09%7B%0A%09%09H
@@ -2957,17 +2957,18 @@
 );%0A%09%09min
-s
+Pt
 .alloc(n
@@ -2978,18 +2978,18 @@
 );%0A%09%09max
-es
+Pt
 .alloc(n
@@ -3031,25 +3031,26 @@
 ++) %7B%0A%09%09%09min
-s
+Pt
 .setV(i, mn)
@@ -3053,26 +3053,26 @@
  mn);%0A%09%09%09max
-es
+Pt
 .setV(i, mx)
@@ -3371,18 +3371,18 @@
 %0A%09%09%09%09max
-es
+Pt
 .getV(i,
@@ -3394,17 +3394,18 @@
 %0A%09%09%09%09min
-s
+Pt
 .getV(i,
@@ -3450,28 +3450,28 @@
 n)) %7B%0A%09%09%09%09%09m
-axes
+inPt
 .setV(i, tmp
@@ -3475,27 +3475,28 @@
 tmp);%0A%09%09%09%09%09m
-ins
+axPt
 .setV(i, tmp
@@ -3564,17 +3564,18 @@
 %09%09%09%09%09min
-s
+Pt
 .setV(i,
@@ -3640,18 +3640,18 @@
 %09%09%09%09%09max
-es
+Pt
 .setV(i,

Improve some code and javadoc a bit