use of de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs in project elki by elki-project.
the class KMLOutputHandler method writeOutlierResult.
private void writeOutlierResult(XMLStreamWriter xmlw, OutlierResult outlierResult, Database database) throws XMLStreamException {
Relation<PolygonsObject> polys = database.getRelation(TypeUtil.POLYGON_TYPE);
Relation<String> labels = DatabaseUtil.guessObjectLabelRepresentation(database);
xmlw.writeStartDocument();
xmlw.writeCharacters("\n");
xmlw.writeStartElement("kml");
xmlw.writeDefaultNamespace("http://earth.google.com/kml/2.2");
xmlw.writeStartElement("Document");
{
// TODO: can we automatically generate more helpful data here?
xmlw.writeStartElement("name");
xmlw.writeCharacters("ELKI KML output for " + outlierResult.getLongName());
// name
xmlw.writeEndElement();
writeNewlineOnDebug(xmlw);
// TODO: e.g. list the settings in the description?
xmlw.writeStartElement("description");
xmlw.writeCharacters("ELKI KML output for " + outlierResult.getLongName());
// description
xmlw.writeEndElement();
writeNewlineOnDebug(xmlw);
}
{
// TODO: generate styles from color scheme
for (int i = 0; i < NUMSTYLES; i++) {
Color col = getColorForValue(i / (NUMSTYLES - 1.0));
xmlw.writeStartElement("Style");
xmlw.writeAttribute("id", "s" + i);
writeNewlineOnDebug(xmlw);
{
xmlw.writeStartElement("LineStyle");
xmlw.writeStartElement("width");
xmlw.writeCharacters("0");
// width
xmlw.writeEndElement();
// LineStyle
xmlw.writeEndElement();
}
writeNewlineOnDebug(xmlw);
{
xmlw.writeStartElement("PolyStyle");
xmlw.writeStartElement("color");
// KML uses AABBGGRR format!
xmlw.writeCharacters(String.format("%02x%02x%02x%02x", col.getAlpha(), col.getBlue(), col.getGreen(), col.getRed()));
// color
xmlw.writeEndElement();
// out.writeStartElement("fill");
// out.writeCharacters("1"); // Default 1
// out.writeEndElement(); // fill
xmlw.writeStartElement("outline");
xmlw.writeCharacters("0");
// outline
xmlw.writeEndElement();
// PolyStyle
xmlw.writeEndElement();
}
writeNewlineOnDebug(xmlw);
// Style
xmlw.writeEndElement();
writeNewlineOnDebug(xmlw);
}
}
DoubleRelation scores = outlierResult.getScores();
Collection<Relation<?>> otherrel = new LinkedList<>(database.getRelations());
otherrel.remove(scores);
otherrel.remove(polys);
otherrel.remove(labels);
otherrel.remove(database.getRelation(TypeUtil.DBID));
ArrayModifiableDBIDs ids = DBIDUtil.newArray(scores.getDBIDs());
scaling.prepare(outlierResult);
for (DBIDIter iter = outlierResult.getOrdering().order(ids).iter(); iter.valid(); iter.advance()) {
double score = scores.doubleValue(iter);
PolygonsObject poly = polys.get(iter);
String label = labels.get(iter);
if (Double.isNaN(score)) {
LOG.warning("No score for object " + DBIDUtil.toString(iter));
}
if (poly == null) {
LOG.warning("No polygon for object " + DBIDUtil.toString(iter) + " - skipping.");
continue;
}
xmlw.writeStartElement("Placemark");
{
xmlw.writeStartElement("name");
xmlw.writeCharacters(score + " " + label);
// name
xmlw.writeEndElement();
StringBuilder buf = makeDescription(otherrel, iter);
xmlw.writeStartElement("description");
xmlw.writeCData("<div>" + buf.toString() + "</div>");
// description
xmlw.writeEndElement();
xmlw.writeStartElement("styleUrl");
int style = (int) (scaling.getScaled(score) * NUMSTYLES);
style = Math.max(0, Math.min(style, NUMSTYLES - 1));
xmlw.writeCharacters("#s" + style);
// styleUrl
xmlw.writeEndElement();
}
{
xmlw.writeStartElement("Polygon");
writeNewlineOnDebug(xmlw);
if (compat) {
xmlw.writeStartElement("altitudeMode");
xmlw.writeCharacters("relativeToGround");
// close altitude mode
xmlw.writeEndElement();
writeNewlineOnDebug(xmlw);
}
// First polygon clockwise?
boolean first = true;
for (Polygon p : poly.getPolygons()) {
if (first) {
xmlw.writeStartElement("outerBoundaryIs");
} else {
xmlw.writeStartElement("innerBoundaryIs");
}
xmlw.writeStartElement("LinearRing");
xmlw.writeStartElement("coordinates");
// Reverse anti-clockwise polygons.
boolean reverse = (p.testClockwise() >= 0);
ArrayListIter<double[]> it = p.iter();
if (reverse) {
it.seek(p.size() - 1);
}
while (it.valid()) {
double[] v = it.get();
xmlw.writeCharacters(FormatUtil.format(v, ","));
if (compat && (v.length == 2)) {
xmlw.writeCharacters(",50");
}
xmlw.writeCharacters(" ");
if (!reverse) {
it.advance();
} else {
it.retract();
}
}
// close coordinates
xmlw.writeEndElement();
// close LinearRing
xmlw.writeEndElement();
// close *BoundaryIs
xmlw.writeEndElement();
first = false;
}
writeNewlineOnDebug(xmlw);
// Polygon
xmlw.writeEndElement();
}
// Placemark
xmlw.writeEndElement();
writeNewlineOnDebug(xmlw);
}
// Document
xmlw.writeEndElement();
// kml
xmlw.writeEndElement();
xmlw.writeEndDocument();
}
use of de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs in project elki by elki-project.
the class HashmapDatabase method insert.
@Override
public DBIDs insert(ObjectBundle objpackages) {
if (objpackages.dataLength() == 0) {
return DBIDUtil.EMPTYDBIDS;
}
// insert into db
ArrayModifiableDBIDs newids = DBIDUtil.newArray(objpackages.dataLength());
Relation<?>[] targets = alignColumns(objpackages);
DBIDVar var = DBIDUtil.newVar();
for (int j = 0; j < objpackages.dataLength(); j++) {
// insert object
if (!objpackages.assignDBID(j, var)) {
var.set(DBIDUtil.generateSingleDBID());
}
if (ids.contains(var)) {
throw new AbortException("Duplicate DBID conflict.");
}
ids.add(var);
for (int i = 0; i < targets.length; i++) {
if (!(targets[i] instanceof ModifiableRelation)) {
throw new AbortException("Non-modifiable relations have been added to the database.");
}
@SuppressWarnings("unchecked") final ModifiableRelation<Object> relation = (ModifiableRelation<Object>) targets[i];
relation.insert(var, objpackages.data(j, i));
}
newids.add(var);
}
// fire insertion event
eventManager.fireObjectsInserted(newids);
return newids;
}
use of de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs in project elki by elki-project.
the class HiCS method calculateContrast.
/**
* Calculates the actual contrast of a given subspace.
*
* @param relation Relation to process
* @param subspace Subspace
* @param subspaceIndex Subspace indexes
*/
private void calculateContrast(Relation<? extends NumberVector> relation, HiCSSubspace subspace, ArrayList<ArrayDBIDs> subspaceIndex, Random random) {
final int card = subspace.cardinality();
final double alpha1 = FastMath.pow(alpha, (1.0 / card));
final int windowsize = (int) (relation.size() * alpha1);
final FiniteProgress prog = LOG.isDebugging() ? new FiniteProgress("Monte-Carlo iterations", m, LOG) : null;
int retries = 0;
double deviationSum = 0.0;
for (int i = 0; i < m; i++) {
// Choose a random set bit.
int chosen = -1;
for (int tmp = random.nextInt(card); tmp >= 0; tmp--) {
chosen = subspace.nextSetBit(chosen + 1);
}
// initialize sample
DBIDs conditionalSample = relation.getDBIDs();
for (int j = subspace.nextSetBit(0); j >= 0; j = subspace.nextSetBit(j + 1)) {
if (j == chosen) {
continue;
}
ArrayDBIDs sortedIndices = subspaceIndex.get(j);
ArrayModifiableDBIDs indexBlock = DBIDUtil.newArray(windowsize);
// initialize index block
DBIDArrayIter iter = sortedIndices.iter();
iter.seek(random.nextInt(relation.size() - windowsize));
for (int k = 0; k < windowsize; k++, iter.advance()) {
// select index block
indexBlock.add(iter);
}
conditionalSample = DBIDUtil.intersection(conditionalSample, indexBlock);
}
if (conditionalSample.size() < 10) {
retries++;
if (LOG.isDebugging()) {
LOG.debug("Sample size very small. Retry no. " + retries);
}
if (retries >= MAX_RETRIES) {
LOG.warning("Too many retries, for small samples: " + retries);
} else {
i--;
continue;
}
}
// Project conditional set
double[] sampleValues = new double[conditionalSample.size()];
{
int l = 0;
for (DBIDIter iter = conditionalSample.iter(); iter.valid(); iter.advance()) {
sampleValues[l] = relation.get(iter).doubleValue(chosen);
l++;
}
}
// Project full set
double[] fullValues = new double[relation.size()];
{
int l = 0;
for (DBIDIter iter = subspaceIndex.get(chosen).iter(); iter.valid(); iter.advance()) {
fullValues[l] = relation.get(iter).doubleValue(chosen);
l++;
}
}
double contrast = statTest.deviation(fullValues, sampleValues);
if (Double.isNaN(contrast)) {
i--;
LOG.warning("Contrast was NaN");
continue;
}
deviationSum += contrast;
LOG.incrementProcessed(prog);
}
LOG.ensureCompleted(prog);
subspace.contrast = deviationSum / m;
}
use of de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs in project elki by elki-project.
the class AbstractAggarwalYuOutlier method buildRanges.
/**
* Grid discretization of the data:<br />
* Each attribute of data is divided into phi equi-depth ranges.<br />
* Each range contains a fraction f=1/phi of the records.
*
* @param relation Relation to process
* @return range map
*/
protected ArrayList<ArrayList<DBIDs>> buildRanges(Relation<V> relation) {
final int dim = RelationUtil.dimensionality(relation);
final int size = relation.size();
final ArrayList<ArrayList<DBIDs>> ranges = new ArrayList<>();
ArrayModifiableDBIDs ids = DBIDUtil.newArray(relation.getDBIDs());
SortDBIDsBySingleDimension sorter = new SortDBIDsBySingleDimension(relation);
// Split into cells
final double part = size * 1.0 / phi;
for (int d = 0; d < dim; d++) {
sorter.setDimension(d);
ids.sort(sorter);
ArrayList<DBIDs> dimranges = new ArrayList<>(phi + 1);
int start = 0;
DBIDArrayIter iter = ids.iter();
for (int r = 1; r <= phi; r++) {
int end = (r < phi) ? (int) (part * r) : size;
ArrayModifiableDBIDs currange = DBIDUtil.newArray(end - start);
for (iter.seek(start); iter.getOffset() < end; iter.advance()) {
currange.add(iter);
}
start = end;
dimranges.add(currange);
}
ranges.add(dimranges);
}
return ranges;
}
use of de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs in project elki by elki-project.
the class OrderingFromRelation method order.
@Override
public ArrayModifiableDBIDs order(DBIDs ids) {
ArrayModifiableDBIDs sorted = DBIDUtil.newArray(ids);
sorted.sort(//
ascending ? //
new RelationUtil.AscendingByDoubleRelation(scores) : new RelationUtil.DescendingByDoubleRelation(scores));
return sorted;
}
Aggregations