All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.it.unimi.dsi.big.util.PermutedFrontCodedStringBigList Maven / Gradle / Ivy

Go to download

The DSI utilities are a mishmash of classes accumulated during the last twenty years in projects developed at the DSI (Dipartimento di Scienze dell'Informazione, i.e., Information Sciences Department), now DI (Dipartimento di Informatica, i.e., Informatics Department), of the Universita` degli Studi di Milano.

There is a newer version: 2.7.3
Show newest version
/*
 * 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") ); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy