src.it.unimi.dsi.big.util.PermutedFrontCodedStringBigList Maven / Gradle / Ivy
Show all versions of dsiutils Show documentation
/*
* DSI utilities
*
* Copyright (C) 2002-2020 Sebastiano Vigna
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see .
*
*/
package it.unimi.dsi.big.util;
import java.io.IOException;
import java.io.Serializable;
import com.martiansoftware.jsap.JSAP;
import com.martiansoftware.jsap.JSAPException;
import com.martiansoftware.jsap.JSAPResult;
import com.martiansoftware.jsap.Parameter;
import com.martiansoftware.jsap.SimpleJSAP;
import com.martiansoftware.jsap.Switch;
import com.martiansoftware.jsap.UnflaggedOption;
import it.unimi.dsi.Util;
import it.unimi.dsi.fastutil.BigArrays;
import it.unimi.dsi.fastutil.io.BinIO;
import it.unimi.dsi.fastutil.io.TextIO;
import it.unimi.dsi.fastutil.longs.LongBidirectionalIterator;
import it.unimi.dsi.fastutil.longs.LongIterators;
import it.unimi.dsi.fastutil.objects.AbstractObjectBigList;
import it.unimi.dsi.fastutil.objects.ObjectBigListIterator;
import it.unimi.dsi.lang.MutableString;
import it.unimi.dsi.util.FrontCodedStringList;
import it.unimi.dsi.util.PermutedFrontCodedStringList;
/**
* A {@link it.unimi.dsi.big.util.FrontCodedStringBigList} whose indices are permuted.
*
*
* This class is functionally identical to {@link PermutedFrontCodedStringList}, except for the
* larger size allowed.
*
* @see FrontCodedStringList
* @see PermutedFrontCodedStringList
*/
public class PermutedFrontCodedStringBigList extends AbstractObjectBigList implements Serializable {
public static final long serialVersionUID = 1;
/** The underlying front-coded string list. */
final protected FrontCodedStringBigList frontCodedStringBigList;
/** The permutation. */
final protected long[][] permutation;
/**
* Creates a new permuted front-coded string list using a given front-coded string list and
* permutation.
*
* @param frontCodedStringBihList the underlying front-coded string big list.
* @param permutation the underlying permutation (a {@linkplain BigArrays big array} of longs).
*/
public PermutedFrontCodedStringBigList(final FrontCodedStringBigList frontCodedStringBihList, final long[][] permutation) {
if (frontCodedStringBihList.size64() != BigArrays.length(permutation)) throw new IllegalArgumentException("The front-coded string big list contains " + frontCodedStringBihList.size64() + " strings, but the permutation is on " + BigArrays.length(permutation) + " elements.");
this.frontCodedStringBigList = frontCodedStringBihList;
this.permutation = permutation;
}
@Override
public MutableString get(final long index) {
return frontCodedStringBigList.get(BigArrays.get(permutation, index));
}
/** Returns the element at the specified position in this front-coded list by storing it in a mutable string.
*
* @param index an index in the list.
* @param s a mutable string that will contain the string at the specified position.
*/
public void get(final long index, final MutableString s) {
frontCodedStringBigList.get(BigArrays.get(permutation, index), s);
}
@Override
public long size64() {
return frontCodedStringBigList.size64();
}
@Override
public ObjectBigListIterator listIterator(final long k) {
return new ObjectBigListIterator() {
final LongBidirectionalIterator i = LongIterators.fromTo(0, frontCodedStringBigList.size64());
long p = 0;
@Override
public boolean hasNext() { return i.hasNext(); }
@Override
public boolean hasPrevious() { return i.hasPrevious(); }
@Override
public CharSequence next() {
p++;
return frontCodedStringBigList.get(BigArrays.get(permutation, i.nextLong()));
}
@Override
public CharSequence previous() {
p--;
return frontCodedStringBigList.get(BigArrays.get(permutation, i.previousLong()));
}
@Override
public long nextIndex() {
return p;
}
@Override
public long previousIndex() {
return p - 1;
}
};
}
public static void main(final String[] arg) throws IOException, ClassNotFoundException, JSAPException {
final SimpleJSAP jsap = new SimpleJSAP(PermutedFrontCodedStringList.class.getName(), "Builds a permuted front-coded list of strings using a given front-coded string list and a permutation (either in text or binary format).",
new Parameter[] {
new Switch("invert", 'i', "invert", "Invert permutation before creating the permuted list."),
new Switch("text", 't', "text", "The permutation is a text file."),
new UnflaggedOption("list", JSAP.STRING_PARSER, JSAP.REQUIRED, "A front-coded string big list."),
new UnflaggedOption("permutation", JSAP.STRING_PARSER, JSAP.REQUIRED, "A permutation for the indices of the list (longs in DataInput format, unless you specify --text)."),
new UnflaggedOption("permutedList", JSAP.STRING_PARSER, JSAP.REQUIRED, "A the filename for the resulting permuted big list."),
});
final JSAPResult jsapResult = jsap.parse(arg);
if (jsap.messagePrinted()) return;
final String permutationFile = jsapResult.getString("permutation");
final long[][] permutation = jsapResult.userSpecified("text") ? LongIterators.unwrapBig(TextIO.asLongIterator(permutationFile)) : BinIO.loadLongsBig(permutationFile);
if (jsapResult.getBoolean("invert")) Util.invertPermutationInPlace(permutation);
BinIO.storeObject(
new PermutedFrontCodedStringBigList((FrontCodedStringBigList)BinIO.loadObject(jsapResult.getString("list")), permutation),
jsapResult.getString("permutedList")
);
}
}