下面列出了com.google.common.collect.ImmutableMultiset#Builder ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Test
public void testLotsOfRandomInserts() {
int lots = 50000;
final FibonacciQueue<Integer> queue = FibonacciQueue.create();
// Insert lots of random numbers.
final ImmutableMultiset.Builder<Integer> insertedBuilder = ImmutableMultiset.builder();
for (int i = 0; i < lots; i++) {
int r = random.nextInt();
insertedBuilder.add(r);
queue.add(r);
}
final Multiset<Integer> inserted = insertedBuilder.build();
assertEquals(lots, queue.size());
// Ensure it contains the same multiset of values that we put in
assertEquals(inserted, ImmutableMultiset.copyOf(queue));
// Ensure the numbers come out in increasing order.
final List<Integer> polled = Lists.newLinkedList();
while (!queue.isEmpty()) {
polled.add(queue.poll());
}
assertTrue(Ordering.<Integer>natural().isOrdered(polled));
// Ensure the same multiset of values came out that we put in
assertEquals(inserted, ImmutableMultiset.copyOf(polled));
assertEquals(0, queue.size());
}
public static ImmutableMultiset<Symbol> toMentionTypeCounts(
final ImmutableSet<TypeRoleFillerRealis> targetEquivClasses,
final ImmutableMultimap<TypeRoleFillerRealis, AssessedResponse> equivClassToAssessedResponse) {
final ImmutableMultiset.Builder<Symbol> mentionTypes = ImmutableMultiset.builder();
for(final TypeRoleFillerRealis equivClass : targetEquivClasses) {
final AssessedResponse assessedResponse = Collections.max(equivClassToAssessedResponse.get(equivClass), Old2014ID);
if(assessedResponse.response().role() == TIME) {
mentionTypes.add(TIME);
}
else {
final Optional<FillerMentionType> mentionType =
assessedResponse.assessment().mentionTypeOfCAS();
if (mentionType.isPresent()) {
mentionTypes.add(Symbol.from(mentionType.get().name()));
}
}
}
return Multisets.copyHighestCountFirst(mentionTypes.build());
}
public static ImmutableMultiset<Symbol> toEventHopperCounts(final ImmutableSet<EventArgumentLinking> linkings) {
final ImmutableMultiset.Builder<Symbol> ret = ImmutableMultiset.builder();
for(final EventArgumentLinking eal : linkings) {
for (final TypeRoleFillerRealisSet ef : eal.eventFrames()) {
final ImmutableSet<Symbol> eventTypes = ImmutableSet.copyOf(FluentIterable.from(ef.asSet())
.transform(type()));
if(eventTypes.size()==1) {
final Symbol eventType = FluentIterable.from(eventTypes).first().get();
ret.add(eventType);
}
else {
log.info("ERROR: a responseLinking set from document {} has multiple event types", eal.docID().toString());
}
}
}
return Multisets.copyHighestCountFirst(ret.build());
}
public static ImmutableMultiset<Symbol> toNumberOfDocsPerEventType(
final ImmutableSet<TypeRoleFillerRealis> equivClasses) {
// for each docid, a set of event types
final ImmutableMap<Symbol, ImmutableSet<Symbol>> eventTypesInEachDoc = getEventTypesInEachDoc(equivClasses);
final ImmutableMultiset.Builder<Symbol> ret = ImmutableMultiset.builder();
for(final Map.Entry<Symbol, ImmutableSet<Symbol>> entry : eventTypesInEachDoc.entrySet()) {
for(final Symbol et : entry.getValue()) {
ret.add(et);
}
}
return Multisets.copyHighestCountFirst(ret.build());
}
private static Multiset<List<Object>> read(ResultSet resultSet)
throws SQLException
{
ImmutableMultiset.Builder<List<Object>> result = ImmutableMultiset.builder();
while (resultSet.next()) {
ImmutableList.Builder<Object> row = ImmutableList.builder();
for (int column = 1; column <= resultSet.getMetaData().getColumnCount(); column++) {
row.add(resultSet.getObject(column));
}
result.add(row.build());
}
return result.build();
}
/**
* Copies contents into an immutable <tt>Multiset</tt> view.
*
* @return a copied view of all keys, with counts for each one of them
*/
@Override
public Multiset<K> keys() {
final ImmutableMultiset.Builder<K> builder = ImmutableMultiset.builder();
entries.forEach((key, values) -> builder.setCount(key, values.size()));
return builder.build();
}
/**
* Calculate the usage of each system
*
* @return
* @throws ZookeeperException
* @throws ZookeeperNotFoundException
* @throws BBoxDBException
*/
protected Multiset<BBoxDBInstance> calculateSystemUsage()
throws ZookeeperException, ZookeeperNotFoundException, BBoxDBException {
final DistributionGroupAdapter zookeeperAdapter
= ZookeeperClientFactory.getZookeeperClient().getDistributionGroupAdapter();
final List<String> distributionGroups = zookeeperAdapter.getDistributionGroups();
// The overall usage
final ImmutableMultiset.Builder<BBoxDBInstance> builder = ImmutableMultiset.builder();
// Calculate usage for each distribution group
for(final String groupName : distributionGroups) {
final SpacePartitioner spacepartitioner = SpacePartitionerCache
.getInstance().getSpacePartitionerForGroupName(groupName);
final DistributionRegion region = spacepartitioner.getRootNode();
final Multiset<BBoxDBInstance> regionSystemUsage
= DistributionRegionHelper.getSystemUtilization(region);
// Merge results
builder.addAll(regionSystemUsage);
}
return builder.build();
}
public ImmutableMultiset construct(int entries) {
ImmutableMultiset.Builder builder = ImmutableMultiset.builder();
for (int i = 0; i < entries; i++) {
builder.add(newEntry());
}
return builder.build();
}
public ImmutableMultiset construct(int entries) {
ImmutableMultiset.Builder builder = ImmutableMultiset.builder();
Object key = newEntry();
for (int i = 0; i < entries; i++) {
builder.add(key);
}
return builder.build();
}
private ImmutableSetMultimap<RoleAndID, DocAndHopper> indexArgsToEventHopper(final Symbol docID,
final EREDocument ereDoc, final ImmutableMultiset.Builder<String> allEREEventTypes) {
final ImmutableSetMultimap.Builder<RoleAndID, DocAndHopper> argsToDocEventsB =
ImmutableSetMultimap.builder();
for (final EREEvent ereEvent : ereDoc.getEvents()) {
boolean loggedType = false;
for (final EREEventMention ereEventMention : ereEvent.getEventMentions()) {
for (final EREArgument ereEventArg : ereEventMention.getArguments()) {
if (ereEventArg instanceof EREEntityArgument) {
final Optional<EREEntity> entityFiller = ((EREEntityArgument) ereEventArg).ereEntity();
if (entityFiller.isPresent()) {
final Optional<Symbol> mappedEventType =
ScoringUtils.mapERETypesToDotSeparated(ontologyMapper, ereEventMention);
final Optional<Symbol> mappedEventRole =
ontologyMapper.eventRole(Symbol.from(ereEventArg.getRole()));
if (mappedEventType.isPresent() && mappedEventRole.isPresent()) {
if (!loggedType) {
// we only want to log events which meet the criteria above, but we only
// want to count each document event once
allEREEventTypes.add(mappedEventType.get().asString());
loggedType = true;
}
argsToDocEventsB.put(
RoleAndID.of(
mappedEventType.get().asString(),
mappedEventRole.get().asString(), entityFiller.get().getID()),
DocAndHopper.of(docID.asString(), ereEvent.getID(),
mappedEventType.get().asString()));
}
}
}
}
}
}
return argsToDocEventsB.build();
}
@ProcessElement
public void processElement(ProcessContext c) throws Exception {
AlleleFreq af = null;
af = c.element().getValue().getOnly(refFreqTag, null);
if (af == null || af.getAltBases() == null) {
// no ref stats
return;
}
if (af.getAltBases().size() != 1) {
throw new IllegalArgumentException("Wrong number (" + af.getAltBases().size() + ") of"
+ " alternate bases for Position " + c.element().getKey());
}
Iterable<ReadBaseQuality> reads = c.element().getValue().getAll(readCountsTag);
ImmutableMultiset.Builder<ReadQualityCount> rqSetBuilder = ImmutableMultiset.builder();
for (ReadBaseQuality r : reads) {
ReadQualityCount.Base b;
if (af.getRefBases().equals(r.getBase())) {
b = ReadQualityCount.Base.REF;
} else if (af.getAltBases().get(0).equals(r.getBase())) {
b = ReadQualityCount.Base.NONREF;
} else {
b = ReadQualityCount.Base.OTHER;
}
ReadQualityCount rqc = new ReadQualityCount();
rqc.setBase(b);
rqc.setQuality(r.getQuality());
rqSetBuilder.add(rqc);
}
ReadCounts rc = new ReadCounts();
rc.setRefFreq(af.getRefFreq());
for (Multiset.Entry<ReadQualityCount> entry : rqSetBuilder.build().entrySet()) {
ReadQualityCount rq = entry.getElement();
rq.setCount(entry.getCount());
rc.addReadQualityCount(rq);
}
c.output(KV.of(c.element().getKey(), rc));
}
private static ImmutableMultiset.Builder<Pair<String, String>> addAttributes(
ImmutableMultiset.Builder<Pair<String, String>> builder,
Iterable<IAttribute> attributes) {
for (IAttribute attribute : attributes) {
for (String value : attribute.getValues()) {
builder.add(Pair.of(attribute.getName(), value));
}
}
return builder;
}
public ImmutableMultiset construct(int entries) {
ImmutableMultiset.Builder builder = ImmutableMultiset.builder();
for (int i = 0; i < entries; i++) {
builder.add(newEntry());
}
return builder.build();
}
public ImmutableMultiset construct(int entries) {
ImmutableMultiset.Builder builder = ImmutableMultiset.builder();
Object key = newEntry();
for (int i = 0; i < entries; i++) {
builder.add(key);
}
return builder.build();
}
@Override
ImmutableMultiset<E> createBackend(Consumer<Builder<E>> backendBuilder) {
ImmutableMultiset.Builder<E> builder = ImmutableMultiset.builder();
backendBuilder.accept(builder::add);
return builder.build();
}
public CorefAnnotation copyMerging(CorefAnnotation toMerge) {
checkArgument(docId == toMerge.docId());
// (1) initialize our mapping of CASes to coref indices with the
// mappings seen in *baseline*. This is used to track the mappings during
// construction, but ret (below) is used to construct the result
final Map<KBPString, Integer> newCASToCoref = Maps.newHashMap(CASesToIDs);
final Builder ret = strictCopyBuilder();
// the next empty index for adding a new coref cluster
// this potentially could fail due to overflow, but the chances are tiny and
// the stakes are low, so we won't worry about it
int nextIndex = newCASToCoref.isEmpty() ? 1 : (1 + Collections.max(newCASToCoref.values()));
// (2) gather a map of coref IDs to the CASes in the corresponding cluster
// from *additional*
final Multimap<Integer, KBPString> additionalCorefToCAS = toMerge.idToCASes;
for (final Map.Entry<KBPString, Integer> newCorefRelation : toMerge.CASesToIDs.entrySet()) {
final int corefId = newCorefRelation.getValue();
final KBPString CAS = newCorefRelation.getKey();
if (!newCASToCoref.containsKey(CAS)) {
// this CAS was not previously coreffed
final StringBuilder msg = new StringBuilder();
// use the baseline cluster which contains most clustermates of CAS
// in "additional"
final Collection<KBPString> clusterMates = additionalCorefToCAS.get(
corefId);
msg.append("\t\tFor CAS ").append(CAS).append(" no coref ID was found in baseline. It has ")
.append(clusterMates.size()).append(" clustermates\n");
// We use an ImmutableMultiset to have deterministic iteration order
// and therefore deterministic tie-breaking if two clusters tie
// on clustermate count
final ImmutableMultiset.Builder<Integer> bCorefIDsOfClusterMatesInBaseline =
ImmutableMultiset.builder();
for (final KBPString clusterMate : clusterMates) {
final Integer corefForClusterMate = newCASToCoref.get(clusterMate);
if (corefForClusterMate != null) {
// we don't have to worry about iterating over the target CAS itself
// because we know it will never pass this check
bCorefIDsOfClusterMatesInBaseline.add(corefForClusterMate);
msg.append("\t\t\t").append(clusterMate).append(" ---> ")
.append(corefForClusterMate).append("\n");
} else {
msg.append("\t\t\t").append(clusterMate).append(" ---> unknown\n");
}
}
final ImmutableMultiset<Integer> corefIDsOfClusterMatesInBaseline =
bCorefIDsOfClusterMatesInBaseline.build();
final int newCorefIdx;
if (!corefIDsOfClusterMatesInBaseline.isEmpty()) {
// we know this will be non-null due to the above check
newCorefIdx = getFirst(copyHighestCountFirst(corefIDsOfClusterMatesInBaseline), null);
msg.append("\t\tMapping to dominant cluster mate cluster ").append(newCorefIdx)
.append("\n");
} else {
// if we had no clustermates with known coref indices, start a new cluster.
// When it comes time to assign coref to our clustermates, if any,
// then we know they will have at least one clustermate with a known coref ID
newCorefIdx = nextIndex;
nextIndex = nextFreeIndex(nextIndex, newCASToCoref);
msg.append("\t\tMapping to new cluster ").append(newCorefIdx).append("\n");
}
log.info(msg.toString());
newCASToCoref.put(CAS, newCorefIdx);
ret.corefCAS(CAS, newCorefIdx);
}
}
for (final KBPString unannotatedCAS : toMerge.unannotated) {
ret.addUnannotatedCAS(unannotatedCAS);
}
return ret.build();
}
private ImmutableSetMultimap<String, EntryPoint> gatherEntryPointsFound(
final ImmutableSet<Symbol> docIDsToScore, final File baseSystemDir,
final Set<String> systemsToUse, final ImmutableMap<Symbol, File> goldDocIDToFileMap,
final CoreNLPXMLLoader coreNLPXMLLoader,
final ImmutableMap<Symbol, File> coreNLPProcessedRawDocs) throws IOException {
final ImmutableSetMultimap.Builder<String, EntryPoint> entryPointsFoundBySystemB =
ImmutableSetMultimap.builder();
// we log the distribution of event types in the corpus for diagnostic purposes
final ImmutableMultiset.Builder<String> allEREEventTypes = ImmutableMultiset.builder();
for (Symbol docID : docIDsToScore) {
// EvalHack - 2016 dry run contains some files for which Serif spuriously adds this document ID
docID = Symbol.from(docID.asString().replace("-kbp", ""));
final EREDocument ereDoc = getEREDocument(docID, goldDocIDToFileMap);
final CoreNLPDocument coreNLPDoc =
coreNLPXMLLoader.loadFrom(coreNLPProcessedRawDocs.get(docID));
final EREAligner ereAligner = EREAligner.create(ereDoc, Optional.of(coreNLPDoc),
ontologyMapper);
// build an index of RoleAndIds to hoppers for lookup in the loop below
final ImmutableSetMultimap<RoleAndID, DocAndHopper> argsToDocEvents =
indexArgsToEventHopper(docID, ereDoc, allEREEventTypes);
for (final String system : systemsToUse) {
final File systemDir = new File(baseSystemDir, system);
try (final SystemOutputStore systemOutput = KBPEA2016OutputLayout.get().open(systemDir)) {
final ImmutableSet.Builder<RoleAndID> alignedEREArgs = ImmutableSet.builder();
// first, gather all document-level arguments which this system found which can
// be aligned to ERE
final Iterable<Response> responses = FluentIterable
.from(systemOutput.read(docID).arguments().responses())
.filter(BANNED_ROLES_FILTER)
.filter(Predicates.compose(not(in(BANNED_EVENTS)), type()));
for (final Response response : responses) {
final Optional<ScoringCorefID> argID =
ereAligner.argumentForResponse(response);
// query entry points can only be entities, not value fillers
if (argID.isPresent() && argID.get().scoringEntityType().isEntityType()) {
alignedEREArgs.add(RoleAndID.of(response.type().asString(), response.role().asString(),
argID.get().withinTypeID()));
}
}
// second, map these to document-level hoppers
for (final RoleAndID alignedArg : alignedEREArgs.build()) {
for (final DocAndHopper docAndHopper : argsToDocEvents.get(alignedArg)) {
entryPointsFoundBySystemB.put(system, EntryPoint.of(docAndHopper, alignedArg));
}
}
}
}
}
log.info("Distribution of event types in ERE: {}",
Multisets.copyHighestCountFirst(allEREEventTypes.build()));
return entryPointsFoundBySystemB.build();
}
/**
* Collector used at the end of a stream to build an immutable multiset.
* <p>
* A collector is used to gather data at the end of a stream operation.
* This method returns a collector allowing streams to be gathered into
* an {@link ImmutableMultiset}.
*
* @param <T> the type of element in the multiset
* @return the immutable multiset collector
*/
public static <T> Collector<T, ImmutableMultiset.Builder<T>, ImmutableMultiset<T>> toImmutableMultiset() {
return Collector.of(
ImmutableMultiset.Builder<T>::new,
ImmutableMultiset.Builder<T>::add,
(l, r) -> l.addAll(r.build()),
ImmutableMultiset.Builder<T>::build,
Collector.Characteristics.UNORDERED);
}