summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
new file mode 100644
index 00000000..d4de36d7
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
@@ -0,0 +1,132 @@
+package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.Arrays;
+
+/**
+ * Histogram class storing int values.
+ *
+ * The histogram will start with "bin" bins, but it can grow dynamically to the
+ * left and right.
+ *
+ * @author Erich Schubert
+ */
+public class IntStaticHistogram extends AbstractStaticHistogram implements IntHistogram {
+ /**
+ * Constructor.
+ *
+ * @param bins Number of bins
+ * @param min Cover minimum
+ * @param max Cover maximum
+ */
+ public IntStaticHistogram(int bins, double min, double max) {
+ super(bins, min, max);
+ if (bins >= 0) {
+ data = new int[bins];
+ } else {
+ data = null;
+ }
+ }
+
+ /**
+ * Data store
+ */
+ int[] data;
+
+ /**
+ * Increment the value of a bin.
+ *
+ * @param coord Coordinate
+ * @param val Value
+ */
+ @Override
+ public void increment(double coord, int val) {
+ int bin = getBinNr(coord);
+ if (bin < 0) {
+ if (size - bin > data.length) {
+ // Reallocate. TODO: use an arraylist-like grow strategy!
+ int[] tmpdata = new int[growSize(data.length, size - bin)];
+ System.arraycopy(data, 0, tmpdata, -bin, size);
+ data = tmpdata;
+ } else {
+ // Shift in place and clear head
+ System.arraycopy(data, 0, data, -bin, size);
+ Arrays.fill(data, 0, -bin, (int) 0);
+ }
+ data[0] = val;
+ // Note that bin is negative, -bin is the shift offset!
+ assert (data.length >= size - bin);
+ offset -= bin;
+ size -= bin;
+ // TODO: modCounter++; and have iterators fast-fail
+ } else if (bin >= data.length) {
+ int[] tmpdata = new int[growSize(data.length, bin + 1)];
+ System.arraycopy(data, 0, tmpdata, 0, size);
+ tmpdata[bin] = val;
+ data = tmpdata;
+ size = bin + 1;
+ // TODO: modCounter++; and have iterators fast-fail
+ // Unset max value when resizing
+ max = Double.MAX_VALUE;
+ } else {
+ if (bin >= size) {
+ // TODO: reset bins to 0 first?
+ size = bin + 1;
+ }
+ data[bin] += val;
+ }
+ }
+
+ /**
+ * Get the value at a particular position.
+ *
+ * @param coord Coordinate
+ * @return Value
+ */
+ public int get(double coord) {
+ int bin = getBinNr(coord);
+ if (bin < 0 || bin >= size) {
+ return 0;
+ }
+ return data[bin];
+ }
+
+ @Override
+ public Iter iter() {
+ return new Iter();
+ }
+
+ /**
+ * Iterator class.
+ *
+ * @author Erich Schubert
+ */
+ public class Iter extends AbstractStaticHistogram.Iter implements IntHistogram.Iter {
+ @Override
+ public int getValue() {
+ return data[bin];
+ }
+ }
+}