package org.basex.gui.view.map;
import org.basex.data.Data;
import org.basex.gui.view.ViewData;
import org.basex.util.Token;
import org.basex.util.Util;
import org.basex.util.list.IntList;
/**
* Stores an integer array of pre values and their corresponding weights.
*
* @author BaseX Team 2005-12, BSD License
* @author Joerg Hauser
*/
final class MapList extends IntList {
/** Weights array. */
double[] weight;
/**
* Constructor.
*/
MapList() {
}
/**
* Constructor, specifying an initial array.
* @param v initial list values
*/
MapList(final int[] v) {
super(v);
}
@Override
public MapList sort() {
sort(weight, false);
return this;
}
/**
* Initializes the weights of each list entry, using the text length of
* nodes or (if the array reference is null) the size attributes.
* @param textLen array holding pre values to text lengths
* @param nchildren reference number of nodes
* @param data reference
* @param w weight
*/
void initWeights(final int[] textLen, final int nchildren, final Data data,
final int w) {
weight = new double[size];
// only children
if(w == 0) {
for(int i = 0; i < size; ++i) {
weight[i] = (double) ViewData.size(data, list[i]) / nchildren;
}
return;
}
// summarize sizes
final double sizeP = w / 100d;
long sum = 0;
for(int i = 0; i < size; ++i) sum += weight(textLen, data, i);
// use #children and size for weight
if(sizeP < 1) {
for(int i = 0; i < size; ++i) {
weight[i] = sizeP * weight(textLen, data, i) / sum +
(1 - sizeP) * ViewData.size(data, list[i]) / nchildren;
}
// only sizes
} else {
for(int i = 0; i < size; ++i) {
weight[i] = weight(textLen, data, i) / sum;
}
}
}
/**
* Returns the numeric weight for the specified input, or 1 as minimum.
* @param textLen array holding pre values to text lengths
* @param data data reference
* @param i array index
* @return calculated weight
*/
private double weight(final int[] textLen, final Data data, final int i) {
final double d;
if(textLen != null) {
d = textLen[list[i]];
} else {
final byte[] val = data.attValue(data.sizeID, list[i]);
d = val != null ? Token.toLong(val) : 0;
}
return d > 1 ? d : 1;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(Util.name(this) + '[');
for(int i = 0; i < size; ++i) {
sb.append(i == 0 ? "" : ", ").append(list[i]);
if(weight != null) sb.append('/').append(weight[i]);
}
return sb.append(']').toString();
}
}