diff options
122 files changed, 1602 insertions, 2041 deletions
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json index b968d1c391f..fb50da7bff1 100644 --- a/container-search/abi-spec.json +++ b/container-search/abi-spec.json @@ -7252,6 +7252,7 @@ "public void setId(com.yahoo.net.URI)", "public void setOrdered(boolean)", "public int size()", + "public void ensureCapacity(int)", "public int getConcreteSize()", "public int getConcreteSizeShallow()", "public int getSubgroupCount()", diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java index 190a7905476..469ef4864bf 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4FillInvoker.java @@ -26,7 +26,6 @@ import static com.yahoo.prelude.fastsearch.VespaBackEndSearcher.hitIterator; * @author ollivir */ public class FS4FillInvoker extends FillInvoker { - private final VespaBackEndSearcher searcher; private FS4Channel channel; @@ -156,10 +155,10 @@ public class FS4FillInvoker extends FillInvoker { result.getQuery().trace((summaryNeedsQuery ? "Resending " : "Not resending ") + "query during document summary fetching", 3); GetDocSumsPacket docsumsPacket = GetDocSumsPacket.create(result, summaryClass, summaryNeedsQuery); - int compressionLimit = result.getQuery().properties().getInteger(FastSearcher.PACKET_COMPRESSION_LIMIT, 0); + int compressionLimit = result.getQuery().properties().getInteger(FS4SearchInvoker.PACKET_COMPRESSION_LIMIT, 0); docsumsPacket.setCompressionLimit(compressionLimit); if (compressionLimit != 0) { - docsumsPacket.setCompressionType(result.getQuery().properties().getString(FastSearcher.PACKET_COMPRESSION_TYPE, "lz4")); + docsumsPacket.setCompressionType(result.getQuery().properties().getString(FS4SearchInvoker.PACKET_COMPRESSION_TYPE, "lz4")); } boolean couldSend = channel.sendPacket(docsumsPacket); diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java index 2353054103d..27c4c73dd65 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FS4SearchInvoker.java @@ -1,21 +1,39 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.fastsearch; +import com.yahoo.data.access.simple.Value; +import com.yahoo.data.access.slime.SlimeAdapter; import com.yahoo.fs4.BasicPacket; import com.yahoo.fs4.ChannelTimeoutException; +import com.yahoo.fs4.DocumentInfo; +import com.yahoo.fs4.FS4Properties; import com.yahoo.fs4.QueryPacket; +import com.yahoo.fs4.QueryPacketData; import com.yahoo.fs4.QueryResultPacket; import com.yahoo.fs4.mplex.FS4Channel; import com.yahoo.fs4.mplex.InvalidChannelException; +import com.yahoo.io.GrowableByteBuffer; +import com.yahoo.log.LogLevel; +import com.yahoo.prelude.ConfigurationException; +import com.yahoo.processing.request.CompoundName; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.dispatch.ResponseMonitor; import com.yahoo.search.dispatch.SearchInvoker; import com.yahoo.search.dispatch.searchcluster.Node; +import com.yahoo.search.query.Sorting; +import com.yahoo.search.result.Coverage; import com.yahoo.search.result.ErrorMessage; +import com.yahoo.search.result.Relevance; import com.yahoo.search.searchchain.Execution; +import com.yahoo.searchlib.aggregation.Grouping; +import com.yahoo.slime.BinaryFormat; +import com.yahoo.vespa.objects.BufferSerializer; import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.logging.Logger; @@ -25,6 +43,9 @@ import java.util.logging.Logger; * @author ollivir */ public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<FS4Channel> { + static final CompoundName PACKET_COMPRESSION_LIMIT = new CompoundName("packetcompressionlimit"); + static final CompoundName PACKET_COMPRESSION_TYPE = new CompoundName("packetcompressiontype"); + private static final Logger log = Logger.getLogger(FS4SearchInvoker.class.getName()); private final VespaBackEndSearcher searcher; @@ -48,7 +69,7 @@ public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<F log.finest("sending query packet"); this.query = query; - this.queryPacket = searcher.createQueryPacket(searcher.getServerId(), query); + createQueryPacket(searcher.getServerId(), query); try { boolean couldSend = channel.sendPacket(queryPacket); @@ -98,13 +119,120 @@ public class FS4SearchInvoker extends SearchInvoker implements ResponseMonitor<F Result result = new Result(query); - searcher.addMetaInfo(query, queryPacket.getQueryPacketData(), resultPacket, result); - - searcher.addUnfilledHits(result, resultPacket.getDocuments(), queryPacket.getQueryPacketData(), distributionKey()); + ensureResultHitCapacity(result, resultPacket); + addMetaInfo(query, queryPacket.getQueryPacketData(), resultPacket, result); + addUnfilledHits(result, resultPacket.getDocuments(), queryPacket.getQueryPacketData()); return result; } + private QueryPacket createQueryPacket(String serverId, Query query) { + this.queryPacket = QueryPacket.create(serverId, query); + int compressionLimit = query.properties().getInteger(PACKET_COMPRESSION_LIMIT, 0); + queryPacket.setCompressionLimit(compressionLimit); + if (compressionLimit != 0) { + queryPacket.setCompressionType(query.properties().getString(PACKET_COMPRESSION_TYPE, "lz4")); + } + log.fine(() -> "made QueryPacket: " + queryPacket); + + return queryPacket; + } + + private void ensureResultHitCapacity(Result result, QueryResultPacket resultPacket) { + int hitCount = resultPacket.getDocumentCount(); + if (resultPacket.getGroupData() != null) { + hitCount++; + } + result.hits().ensureCapacity(hitCount); + } + + private void addMetaInfo(Query query, QueryPacketData queryPacketData, QueryResultPacket resultPacket, Result result) { + result.setTotalHitCount(resultPacket.getTotalDocumentCount()); + + addBackendTrace(query, resultPacket); + + // Grouping + if (resultPacket.getGroupData() != null) { + byte[] data = resultPacket.getGroupData(); + ArrayList<Grouping> list = new ArrayList<>(); + BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(ByteBuffer.wrap(data))); + int cnt = buf.getInt(null); + for (int i = 0; i < cnt; i++) { + Grouping g = new Grouping(); + g.deserialize(buf); + list.add(g); + } + GroupingListHit hit = new GroupingListHit(list, searcher.getDocsumDefinitionSet(query)); + hit.setQuery(result.getQuery()); + hit.setSource(getName()); + hit.setQueryPacketData(queryPacketData); + result.hits().add(hit); + } + + if (resultPacket.getCoverageFeature()) { + result.setCoverage(new Coverage(resultPacket.getCoverageDocs(), resultPacket.getActiveDocs(), resultPacket.getNodesReplied()) + .setSoonActive(resultPacket.getSoonActiveDocs()) + .setDegradedReason(resultPacket.getDegradedReason()) + .setNodesTried(resultPacket.getNodesQueried())); + } + } + + private void addBackendTrace(Query query, QueryResultPacket resultPacket) { + if (resultPacket.propsArray == null) return; + Value.ArrayValue traces = new Value.ArrayValue(); + for (FS4Properties properties : resultPacket.propsArray) { + if ( ! properties.getName().equals("trace")) continue; + for (FS4Properties.Entry entry : properties.getEntries()) { + traces.add(new SlimeAdapter(BinaryFormat.decode(entry.getValue()).get())); + } + } + query.trace(traces, query.getTraceLevel()); + } + + /** + * Creates unfilled hits from a List of DocumentInfo instances. + */ + private void addUnfilledHits(Result result, List<DocumentInfo> documents, QueryPacketData queryPacketData) { + Query myQuery = result.getQuery(); + Sorting sorting = myQuery.getRanking().getSorting(); + Optional<Integer> channelDistributionKey = distributionKey(); + + for (DocumentInfo document : documents) { + + try { + FastHit hit = new FastHit(); + hit.setQuery(myQuery); + if (queryPacketData != null) + hit.setQueryPacketData(queryPacketData); + + hit.setFillable(); + hit.setCached(false); + + extractDocumentInfo(hit, document, sorting); + channelDistributionKey.ifPresent(hit::setDistributionKey); + + result.hits().add(hit); + } catch (ConfigurationException e) { + log.log(LogLevel.WARNING, "Skipping hit", e); + } catch (Exception e) { + log.log(LogLevel.ERROR, "Skipping malformed hit", e); + } + } + } + + private void extractDocumentInfo(FastHit hit, DocumentInfo document, Sorting sorting) { + hit.setSource(getName()); + + Number rank = document.getMetric(); + + hit.setRelevance(new Relevance(rank.doubleValue())); + + hit.setDistributionKey(document.getDistributionKey()); + hit.setGlobalId(document.getGlobalId()); + hit.setPartId(document.getPartId()); + hit.setSortData(document.getSortData(), sorting); + } + @Override public void release() { if (channel != null) { diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java index f5e437c2410..055b41fd89d 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java @@ -2,18 +2,9 @@ package com.yahoo.prelude.fastsearch; import com.yahoo.collections.TinyIdentitySet; -import com.yahoo.data.access.simple.Value; -import com.yahoo.data.access.slime.SlimeAdapter; import com.yahoo.fs4.DocsumPacket; -import com.yahoo.fs4.DocumentInfo; -import com.yahoo.fs4.FS4Properties; import com.yahoo.fs4.Packet; import com.yahoo.fs4.QueryPacket; -import com.yahoo.fs4.QueryPacketData; -import com.yahoo.fs4.QueryResultPacket; -import com.yahoo.io.GrowableByteBuffer; -import com.yahoo.log.LogLevel; -import com.yahoo.prelude.ConfigurationException; import com.yahoo.prelude.query.Item; import com.yahoo.prelude.query.NullItem; import com.yahoo.prelude.query.textualrepresentation.TextualQueryRepresentation; @@ -24,20 +15,14 @@ import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.cluster.PingableSearcher; import com.yahoo.search.grouping.vespa.GroupingExecutor; -import com.yahoo.search.query.Sorting; -import com.yahoo.search.result.Coverage; import com.yahoo.search.result.ErrorHit; import com.yahoo.search.result.ErrorMessage; import com.yahoo.search.result.Hit; -import com.yahoo.search.result.Relevance; import com.yahoo.search.searchchain.Execution; import com.yahoo.searchlib.aggregation.Grouping; -import com.yahoo.slime.BinaryFormat; -import com.yahoo.vespa.objects.BufferSerializer; import java.io.IOException; import java.lang.reflect.Constructor; -import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; @@ -55,8 +40,6 @@ import java.util.logging.Logger; */ public abstract class VespaBackEndSearcher extends PingableSearcher { - static final CompoundName PACKET_COMPRESSION_LIMIT = new CompoundName("packetcompressionlimit"); - static final CompoundName PACKET_COMPRESSION_TYPE = new CompoundName("packetcompressiontype"); private static final CompoundName TRACE_DISABLE = new CompoundName("trace.disable"); private String serverId; @@ -198,19 +181,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { return result; } - protected QueryPacket createQueryPacket(String serverId, Query query) { - QueryPacket queryPacket = QueryPacket.create(serverId, query); - int compressionLimit = query.properties().getInteger(PACKET_COMPRESSION_LIMIT, 0); - queryPacket.setCompressionLimit(compressionLimit); - if (compressionLimit != 0) - queryPacket.setCompressionType(query.properties().getString(PACKET_COMPRESSION_TYPE, "lz4")); - - if (isLoggingFine()) - getLogger().fine("made QueryPacket: " + queryPacket); - - return queryPacket; - } - private List<Result> partitionHits(Result result, String summaryClass) { List<Result> parts = new ArrayList<>(); TinyIdentitySet<Query> queryMap = new TinyIdentitySet<>(4); @@ -343,49 +313,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { } } - private void addBackendTrace(Query query, QueryResultPacket resultPacket) { - if (resultPacket.propsArray == null) return; - Value.ArrayValue traces = new Value.ArrayValue(); - for (FS4Properties properties : resultPacket.propsArray) { - if ( ! properties.getName().equals("trace")) continue; - for (FS4Properties.Entry entry : properties.getEntries()) { - traces.add(new SlimeAdapter(BinaryFormat.decode(entry.getValue()).get())); - } - } - query.trace(traces, query.getTraceLevel()); - } - - void addMetaInfo(Query query, QueryPacketData queryPacketData, QueryResultPacket resultPacket, Result result) { - result.setTotalHitCount(resultPacket.getTotalDocumentCount()); - - addBackendTrace(query, resultPacket); - - // Grouping - if (resultPacket.getGroupData() != null) { - byte[] data = resultPacket.getGroupData(); - ArrayList<Grouping> list = new ArrayList<>(); - BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(ByteBuffer.wrap(data))); - int cnt = buf.getInt(null); - for (int i = 0; i < cnt; i++) { - Grouping g = new Grouping(); - g.deserialize(buf); - list.add(g); - } - GroupingListHit hit = new GroupingListHit(list, getDocsumDefinitionSet(query)); - hit.setQuery(result.getQuery()); - hit.setSource(getName()); - hit.setQueryPacketData(queryPacketData); - result.hits().add(hit); - } - - if (resultPacket.getCoverageFeature()) { - result.setCoverage(new Coverage(resultPacket.getCoverageDocs(), resultPacket.getActiveDocs(), resultPacket.getNodesReplied()) - .setSoonActive(resultPacket.getSoonActiveDocs()) - .setDegradedReason(resultPacket.getDegradedReason()) - .setNodesTried(resultPacket.getNodesQueried())); - } - } - static class FillHitResult { final boolean ok; final String error; @@ -451,19 +378,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { return new FillHitsResult(skippedHits, lastError); } - private void extractDocumentInfo(FastHit hit, DocumentInfo document, Sorting sorting) { - hit.setSource(getName()); - - Number rank = document.getMetric(); - - hit.setRelevance(new Relevance(rank.doubleValue())); - - hit.setDistributionKey(document.getDistributionKey()); - hit.setGlobalId(document.getGlobalId()); - hit.setPartId(document.getPartId()); - hit.setSortData(document.getSortData(), sorting); - } - protected DocsumDefinitionSet getDocsumDefinitionSet(Query query) { DocumentDatabase db = getDocumentDatabase(query); return db.getDocsumDefinitionSet(); @@ -483,46 +397,6 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { return error; } - /** - * Creates unfilled hits from a List of DocumentInfo instances. Do note - * cacheKey should be available if a cache is active, even if the hit is not - * created from a cache in the current call path. - * - * @param queryPacketData binary data from first phase of search, or null - * @param channelDistributionKey distribution key of the node producing these hits. - * Only set if produced directly by a search node, not dispatch - * (in which case it is not set in the received packets.) - */ - void addUnfilledHits(Result result, - List<DocumentInfo> documents, - QueryPacketData queryPacketData, - Optional<Integer> channelDistributionKey) { - Query myQuery = result.getQuery(); - Sorting sorting = myQuery.getRanking().getSorting(); - - for (DocumentInfo document : documents) { - - try { - FastHit hit = new FastHit(); - hit.setQuery(myQuery); - if (queryPacketData != null) - hit.setQueryPacketData(queryPacketData); - - hit.setFillable(); - hit.setCached(false); - - extractDocumentInfo(hit, document, sorting); - channelDistributionKey.ifPresent(hit::setDistributionKey); - - result.hits().add(hit); - } catch (ConfigurationException e) { - getLogger().log(LogLevel.WARNING, "Skipping hit", e); - } catch (Exception e) { - getLogger().log(LogLevel.ERROR, "Skipping malformed hit", e); - } - } - } - @SuppressWarnings("rawtypes") public static VespaBackEndSearcher getSearcher(String s) { try { diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java b/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java index e44a86ddd2d..d7aec40bcf9 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/PhraseItem.java @@ -48,18 +48,12 @@ public class PhraseItem extends CompositeIndexedItem { } } - /** - * Sets whether this was explicitly written as a phrase using quotes by the - * user - */ + /** Sets whether this was explicitly written as a phrase using quotes by the user */ public void setExplicit(boolean explicit) { this.explicit = explicit; } - /** - * Returns whether this was explicitly written as a phrase using quotes by - * the user Default is false - */ + /** Returns whether this was explicitly written as a phrase using quotes by the user Default is false */ public boolean isExplicit() { return explicit; } @@ -74,8 +68,7 @@ public class PhraseItem extends CompositeIndexedItem { * this phrase. If the item is a word, it will simply be added, if the item * is a phrase, each of the words of the phrase will be added. * - * @throws IllegalArgumentException - * if the given item is not a WordItem or PhraseItem + * @throws IllegalArgumentException if the given item is not a WordItem or PhraseItem */ public void addItem(Item item) { if (item instanceof WordItem || item instanceof PhraseSegmentItem || item instanceof WordAlternativesItem) { @@ -89,8 +82,7 @@ public class PhraseItem extends CompositeIndexedItem { addIndexedItem((IndexedItem) i.next()); } } else { - throw new IllegalArgumentException("Can not add " + item - + " to a phrase"); + throw new IllegalArgumentException("Can not add " + item + " to a phrase"); } } @@ -107,8 +99,7 @@ public class PhraseItem extends CompositeIndexedItem { addIndexedItem(index++, (WordItem) i.next()); } } else { - throw new IllegalArgumentException("Can not add " + item - + " to a phrase"); + throw new IllegalArgumentException("Can not add " + item + " to a phrase"); } } @@ -130,8 +121,7 @@ public class PhraseItem extends CompositeIndexedItem { } return toReturn; } else { - throw new IllegalArgumentException("Can not add " + item - + " to a phrase"); + throw new IllegalArgumentException("Can not add " + item + " to a phrase"); } } @@ -153,10 +143,8 @@ public class PhraseItem extends CompositeIndexedItem { /** * Returns a subitem as a word item * - * @param index - * the (0-base) index of the item to return - * @throws IndexOutOfBoundsException - * if there is no subitem at index + * @param index the (0-base) index of the item to return + * @throws IndexOutOfBoundsException if there is no subitem at index */ public WordItem getWordItem(int index) { return (WordItem) getItem(index); @@ -197,9 +185,7 @@ public class PhraseItem extends CompositeIndexedItem { return itemCount; } - /** - * Returns false, no parenthezes for phrases - */ + /** Returns false, no parenthezes for phrases */ protected boolean shouldParenthize() { return false; } @@ -263,4 +249,5 @@ public class PhraseItem extends CompositeIndexedItem { super.disclose(discloser); discloser.addProperty("explicit", explicit); } + } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java index 5e994dac5d6..72ee4ae2c12 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java @@ -13,7 +13,8 @@ import static com.yahoo.prelude.query.parser.Token.Kind.SPACE; /** * Parser for queries of type all. * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen + * @author bratseth */ public class AllParser extends SimpleParser { @@ -32,37 +33,37 @@ public class AllParser extends SimpleParser { protected Item parseItemsBody() { // Algorithm: Collect positive, negative, and and'ed items, then combine. - AndItem and=null; - NotItem not=null; // Store negatives here as we go + AndItem and = null; + NotItem not = null; // Store negatives here as we go Item current; // Find all items do { - current=negativeItem(); - if (current!=null) { - not=addNot(current,not); + current = negativeItem(); + if (current != null) { + not = addNot(current, not); continue; } - current=positiveItem(); - if (current==null) + current = positiveItem(); + if (current == null) current = indexableItem(); if (current == null) current = compositeItem(); - if (current!=null) - and=addAnd(current,and); + if (current != null) + and = addAnd(current, and); if (current == null) tokens.skip(); } while (tokens.hasNext()); // Combine the items - Item topLevel=and; + Item topLevel = and; - if (not!=null && topLevel!=null) { + if (not != null && topLevel != null) { not.setPositiveItem(topLevel); - topLevel=not; + topLevel = not; } return simplifyUnnecessaryComposites(topLevel); @@ -78,23 +79,23 @@ public class AllParser extends SimpleParser { return root.getRoot() instanceof NullItem ? null : root.getRoot(); } - protected AndItem addAnd(Item item,AndItem and) { - if (and==null) - and=new AndItem(); + protected AndItem addAnd(Item item, AndItem and) { + if (and == null) + and = new AndItem(); and.addItem(item); return and; } protected OrItem addOr(Item item,OrItem or) { - if (or==null) - or=new OrItem(); + if (or == null) + or = new OrItem(); or.addItem(item); return or; } protected NotItem addNot(Item item,NotItem not) { - if (not==null) - not=new NotItem(); + if (not == null) + not = new NotItem(); not.addNegativeItem(item); return not; } @@ -103,8 +104,7 @@ public class AllParser extends SimpleParser { int position = tokens.getPosition(); Item item = null; try { - if (!tokens.skipMultiple(MINUS)) return null; - + if ( ! tokens.skip(MINUS)) return null; if (tokens.currentIsNoIgnore(SPACE)) return null; item = indexableItem(); @@ -122,8 +122,18 @@ public class AllParser extends SimpleParser { } } } - if (item!=null) + if (item != null) item.setProtected(true); + + // Heuristic overdrive engaged! + // Interpret -N as a positive item matching a negative number (by backtracking out of this) + // but not if there is an explicit index (such as -a:b) + // but interpret --N as a negative item matching a negative number + if ( item instanceof IntItem && + ((IntItem)item).getIndexName().isEmpty() && + ! ((IntItem)item).getNumber().startsWith(("-"))) + item = null; + return item; } finally { if (item == null) { diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java index 291beb40b4c..9ddfea6dffb 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java @@ -10,10 +10,10 @@ import static com.yahoo.prelude.query.parser.Token.Kind.PLUS; import static com.yahoo.prelude.query.parser.Token.Kind.SPACE; /** - * Base class for parsers of the "simple" query languages (query types - * ANY and ALL). + * Base class for parsers of the "simple" query languages (query types ANY and ALL). * * @author Steinar Knutsen + * @author bratseth */ abstract class SimpleParser extends StructuredParser { @@ -25,7 +25,6 @@ abstract class SimpleParser extends StructuredParser { return anyItems(false); // Nesteds are any even if all on top level } - protected abstract Item negativeItem(); /** @@ -163,11 +162,7 @@ abstract class SimpleParser extends StructuredParser { return false; } - - /** - * Removes and returns the first <i>not</i> found in the composite, - * or returns null if there's none - */ + /** Removes and returns the first <i>not</i> found in the composite, or returns null if there's none */ private NotItem removeNot(CompositeItem composite) { for (int i = 0; i < composite.getItemCount(); i++) { if (composite.getItem(i) instanceof NotItem) { @@ -184,7 +179,7 @@ abstract class SimpleParser extends StructuredParser { Item item = null; try { - if (!tokens.skipMultiple(PLUS)) { + if ( ! tokens.skipMultiple(PLUS)) { return null; } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java index ec1f79828c1..8ecd4d8f81c 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java @@ -60,7 +60,7 @@ abstract class StructuredParser extends AbstractParser { String indexName = indexPrefix(); setSubmodeFromIndex(indexName, indexFacts); - item = number(indexName != null); + item = number(); if (item == null) { item = phrase(); @@ -147,39 +147,36 @@ abstract class StructuredParser extends AbstractParser { List<Token> firstWord = new ArrayList<>(); List<Token> secondWord = new ArrayList<>(); - tokens.skip(LSQUAREBRACKET); // For test 93 and 60 + tokens.skip(LSQUAREBRACKET); - if (!tokens.currentIs(WORD) && !tokens.currentIs(NUMBER) - && !tokens.currentIs(UNDERSCORE)) { + if ( ! tokens.currentIs(WORD) && ! tokens.currentIs(NUMBER) && ! tokens.currentIs(UNDERSCORE)) { return null; } firstWord.add(tokens.next()); while (tokens.currentIsNoIgnore(UNDERSCORE) - || tokens.currentIsNoIgnore(WORD) - || tokens.currentIsNoIgnore(NUMBER)) { + || tokens.currentIsNoIgnore(WORD) + || tokens.currentIsNoIgnore(NUMBER)) { firstWord.add(tokens.next()); } if (tokens.currentIsNoIgnore(DOT)) { tokens.skip(); - if (tokens.currentIsNoIgnore(WORD) - || tokens.currentIsNoIgnore(NUMBER)) { + if (tokens.currentIsNoIgnore(WORD) || tokens.currentIsNoIgnore(NUMBER)) { secondWord.add(tokens.next()); } else { return null; } while (tokens.currentIsNoIgnore(UNDERSCORE) - || tokens.currentIsNoIgnore(WORD) - || tokens.currentIsNoIgnore(NUMBER)) { + || tokens.currentIsNoIgnore(WORD) + || tokens.currentIsNoIgnore(NUMBER)) { secondWord.add(tokens.next()); } } - if (!tokens.skipNoIgnore(COLON)) { + if ( ! tokens.skipNoIgnore(COLON)) return null; - } if (secondWord.size() == 0) { item = concatenate(firstWord); @@ -195,8 +192,7 @@ abstract class StructuredParser extends AbstractParser { return null; } else { if (nothingAhead(false)) { - // correct index syntax, correct name, but followed - // by noise. Let's skip this. + // correct index syntax, correct name, but followed by noise. Let's skip this. nothingAhead(true); position = tokens.getPosition(); item = indexPrefix(); @@ -253,11 +249,11 @@ abstract class StructuredParser extends AbstractParser { private boolean endOfNumber() { return tokens.currentIsNoIgnore(SPACE) - || tokens.currentIsNoIgnore(RSQUAREBRACKET) - || tokens.currentIsNoIgnore(SEMICOLON) - || tokens.currentIsNoIgnore(RBRACE) - || tokens.currentIsNoIgnore(EOF) - || tokens.currentIsNoIgnore(EXCLAMATION); + || tokens.currentIsNoIgnore(RSQUAREBRACKET) + || tokens.currentIsNoIgnore(SEMICOLON) + || tokens.currentIsNoIgnore(RBRACE) + || tokens.currentIsNoIgnore(EOF) + || tokens.currentIsNoIgnore(EXCLAMATION); } private String decimalPart() { @@ -277,19 +273,19 @@ abstract class StructuredParser extends AbstractParser { } } - private IntItem number(boolean hasIndex) { + private IntItem number() { int position = tokens.getPosition(); IntItem item = null; try { - if (item == null) { - item = numberRange(); - } + item = numberRange(); - tokens.skip(LSQUAREBRACKET); // For test 93 and 60 + tokens.skip(LSQUAREBRACKET); + if (item == null) + tokens.skipNoIgnore(SPACE); // TODO: Better definition of start and end of numeric items - if (item == null && hasIndex && tokens.currentIsNoIgnore(MINUS) && (tokens.currentNoIgnore(1).kind == NUMBER)) { + if (item == null && tokens.currentIsNoIgnore(MINUS) && (tokens.currentNoIgnore(1).kind == NUMBER)) { tokens.skipNoIgnore(); Token t = tokens.next(); item = new IntItem("-" + t.toString() + decimalPart(), true); @@ -307,7 +303,7 @@ abstract class StructuredParser extends AbstractParser { if (item == null) { item = numberGreater(); } - if (item != null && !endOfNumber()) { + if (item != null && ! endOfNumber()) { item = null; } return item; diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java index 42cef67f189..fbaf1675ff1 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java @@ -1,10 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.query.parser; - import java.util.List; - /** * An iterator-like view of a list of tokens, but typed, random-accessible * and with more convenience methods @@ -183,8 +181,7 @@ final class TokenPosition { /** * Skips one or zero items of the given kind. * - * @return true if one item was skipped, false if none was, - * or if there are no more tokens + * @return true if one item was skipped, false if none was, or if there are no more tokens */ public boolean skip(Token.Kind kind) { Token current = current(); @@ -198,20 +195,16 @@ final class TokenPosition { } /** - * Skips one or zero items of the given kind, without ignoring - * spaces + * Skips one or zero items of the given kind, without ignoring spaces * - * @return true if one item was skipped, false if none was, - * or if there are no more tokens + * @return true if one item was skipped, false if none was or if there are no more tokens */ public boolean skipNoIgnore(Token.Kind kind) { Token current = currentNoIgnore(); - if (current == null || current.kind != kind) { - return false; - } + if (current == null || current.kind != kind) return false; - skip(); + skipNoIgnore(); return true; } diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java index 033b507b4a4..76da9fbc1f7 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java @@ -168,10 +168,17 @@ public class ProtobufSerialization { result.setTotalHitCount(protobuf.getTotalHitCount()); result.setCoverage(convertToCoverage(protobuf)); - if (protobuf.getGroupingBlob() != null && !protobuf.getGroupingBlob().isEmpty()) { - ArrayList<Grouping> list = new ArrayList<>(); + int hitItems = protobuf.getHitsCount(); + var haveGrouping = protobuf.getGroupingBlob() != null && !protobuf.getGroupingBlob().isEmpty(); + if(haveGrouping) { + hitItems++; + } + result.hits().ensureCapacity(hitItems); + + if (haveGrouping) { BufferSerializer buf = new BufferSerializer(new GrowableByteBuffer(protobuf.getGroupingBlob().asReadOnlyByteBuffer())); int cnt = buf.getInt(null); + ArrayList<Grouping> list = new ArrayList<>(cnt); for (int i = 0; i < cnt; i++) { Grouping g = new Grouping(); g.deserialize(buf); diff --git a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java index 18e4cdb35d6..ae1d82ef0fb 100644 --- a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java +++ b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java @@ -976,6 +976,7 @@ public class SelectParser implements Parser { PhraseItem phrase = new PhraseItem(); phrase.setIndexName(field); + phrase.setExplicit(true); HashMap<Integer, Inspector> children = childMap(value); for (Inspector word : children.values()) { diff --git a/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java b/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java index 32c386f0e32..b3d79f65df4 100644 --- a/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java +++ b/container-search/src/main/java/com/yahoo/search/query/parser/Parser.java @@ -15,8 +15,7 @@ public interface Parser { * {@link QueryTree}. If parsing fails without an exception, the contained * root will be an instance of {@link com.yahoo.prelude.query.NullItem}. * - * @param query - * the Parsable to parse + * @param query the Parsable to parse * @return the parsed QueryTree, never null */ QueryTree parse(Parsable query); diff --git a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java index 8755d0b0897..9ecd6513a94 100644 --- a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java +++ b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java @@ -191,6 +191,10 @@ public class HitGroup extends Hit implements DataList<Hit>, Cloneable, Iterable< return hits.size(); } + public void ensureCapacity(int minCapacity) { + hits.ensureCapacity(minCapacity); + } + /** * <p>Returns the number of concrete hits contained in this group * and all subgroups. This should equal the diff --git a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java index 6a56f94c724..5427da6c06c 100644 --- a/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java +++ b/container-search/src/main/java/com/yahoo/search/searchchain/Execution.java @@ -481,7 +481,7 @@ public class Execution extends com.yahoo.processing.execution.Execution { * if searchChain is null */ @SuppressWarnings("unchecked") - private Execution(Chain<? extends Processor> searchChain,Context context, int searcherIndex) { + private Execution(Chain<? extends Processor> searchChain, Context context, int searcherIndex) { // Create a new Execution which is placed in the context of the execution of the given Context if any // "if any" because a context may, or may not, belong to an execution. // This is decided at the creation time of the Context - Context instances which do not belong diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java index af095fefc1c..45fdc4653c4 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java +++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java @@ -539,6 +539,7 @@ public class YqlParser implements Parser { PhraseItem phrase = new PhraseItem(); phrase.setIndexName(field); + phrase.setExplicit(true); for (OperatorNode<ExpressionOperator> word : ast.<List<OperatorNode<ExpressionOperator>>> getArgument(1)) { if (word.getOperator() == ExpressionOperator.CALL) { List<String> names = word.getArgument(0); @@ -712,7 +713,7 @@ public class YqlParser implements Parser { .setLanguage(language) .setDefaultIndexName(defaultIndex)).getRoot(); // the null check should be unnecessary, but is there to avoid having to suppress null warnings - if ( !allowNullItem && (item == null || item instanceof NullItem)) + if ( ! allowNullItem && (item == null || item instanceof NullItem)) throw new IllegalArgumentException("Parsing '" + wordData + "' only resulted in NullItem."); if (language != Language.ENGLISH) // mark the language used, unless it's the default diff --git a/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java index 12f9ef2b18f..dc2f990431a 100644 --- a/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/query/parser/test/ParseTestCase.java @@ -1957,7 +1957,12 @@ public class ParseTestCase { @Test public void testNumbersAndNot() { - tester.assertParsed("+a -12", "a -12", Query.Type.ALL); + tester.assertParsed("AND a -12", "a -12", Query.Type.ALL); + } + + @Test + public void testNumbersAndDoubleNot() { + tester.assertParsed("+a --12", "a --12", Query.Type.ALL); } @Test @@ -1966,8 +1971,18 @@ public class ParseTestCase { } @Test + public void testNegativeTermPositiveNumberWithIndex() { + tester.assertParsed("+a -normal:12", "a -normal:12", Query.Type.ALL); + } + + @Test + public void testNegativeTermNegativeNumberWithIndex() { + tester.assertParsed("+a -normal:-12", "a -normal:-12", Query.Type.ALL); + } + + @Test public void testSingleNegativeNumberLikeTerm() { - tester.assertParsed(null, "-12", Query.Type.ALL); + tester.assertParsed("-12", "-12", Query.Type.ALL); } @Test @@ -2004,7 +2019,12 @@ public class ParseTestCase { @Test public void testDecimalNumbersAndNot() { - tester.assertParsed("+a -12.2", "a -12.2", Query.Type.ALL); + tester.assertParsed("AND a -12.2", "a -12.2", Query.Type.ALL); + } + + @Test + public void testDecimalNumbersAndDoubleNot() { + tester.assertParsed("+a --12.2", "a --12.2", Query.Type.ALL); } @Test @@ -2014,7 +2034,7 @@ public class ParseTestCase { @Test public void testSingleNegativeDecimalNumberLikeTerm() { - tester.assertParsed(null, "-12.2", Query.Type.ALL); + tester.assertParsed("-12.2", "-12.2", Query.Type.ALL); } @Test @@ -2321,12 +2341,12 @@ public class ParseTestCase { @Test public void testSingleNegativeNumberLikeTermWeb() { - tester.assertParsed(null, "-12", Query.Type.WEB); + tester.assertParsed("-12", "-12", Query.Type.WEB); } @Test public void testSingleNegativeDecimalNumberLikeTermWeb() { - tester.assertParsed(null, "-12.2", Query.Type.WEB); + tester.assertParsed("-12.2", "-12.2", Query.Type.WEB); } @Test diff --git a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java index b5c4166e4de..6173d710434 100644 --- a/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/yql/UserInputTestCase.java @@ -118,6 +118,17 @@ public class UserInputTestCase { } @Test + public void testNegativeNumberComparison() { + URIBuilder builder = searchUri(); + builder.setParameter("myinput", "-5"); + builder.setParameter("yql", + "select * from ecitem where rank(([{\"defaultIndex\":\"myfield\"}](userInput(@myinput))));"); + Query query = searchAndAssertNoErrors(builder); + assertEquals("select * from ecitem where rank(myfield = (-5));", query.yqlRepresentation()); + assertEquals("RANK myfield:-5", query.getModel().getQueryTree().getRoot().toString()); + } + + @Test public void testAnnotatedUserInputUnrankedTerms() { URIBuilder builder = searchUri(); builder.setParameter("yql", diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java new file mode 100644 index 00000000000..2503325760d --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/certificates/CertificateProvider.java @@ -0,0 +1,9 @@ +package com.yahoo.vespa.hosted.controller.api.integration.certificates; + +import java.security.KeyPair; +import java.security.cert.X509Certificate; +import java.util.List; + +public interface CertificateProvider { + List<X509Certificate> requestCaSignedCertificate(KeyPair keyPair, List<String> domains); +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java index 63faadfe555..dfed0476aab 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java @@ -24,18 +24,18 @@ public class MemoryNameService implements NameService { @Override public Record createCname(RecordName name, RecordData canonicalName) { - Record record = new Record(Record.Type.CNAME, name, canonicalName); + var record = new Record(Record.Type.CNAME, name, canonicalName); records.add(record); return record; } @Override public List<Record> createAlias(RecordName name, Set<AliasTarget> targets) { - List<Record> records = targets.stream() - .sorted((a, b) -> Comparator.comparing(AliasTarget::name).compare(a, b)) - .map(target -> new Record(Record.Type.ALIAS, name, - RecordData.fqdn(target.name().value()))) - .collect(Collectors.toList()); + var records = targets.stream() + .sorted((a, b) -> Comparator.comparing(AliasTarget::name).compare(a, b)) + .map(target -> new Record(Record.Type.ALIAS, name, + RecordData.fqdn(target.name().value()))) + .collect(Collectors.toList()); // Satisfy idempotency contract of interface removeRecords(findRecords(Record.Type.ALIAS, name)); this.records.addAll(records); @@ -43,10 +43,12 @@ public class MemoryNameService implements NameService { } @Override - public Record createTxt(RecordName name, RecordData txtData) { - Record record = new Record(Record.Type.TXT, name, txtData); - records.add(record); - return record; + public List<Record> createTxtRecords(RecordName name, List<RecordData> txtData) { + var records = txtData.stream() + .map(data -> new Record(Record.Type.TXT, name, data)) + .collect(Collectors.toList()); + this.records.addAll(records); + return records; } @Override @@ -65,7 +67,7 @@ public class MemoryNameService implements NameService { @Override public void updateRecord(Record record, RecordData newData) { - List<Record> records = findRecords(record.type(), record.name()); + var records = findRecords(record.type(), record.name()); if (records.isEmpty()) { throw new IllegalArgumentException("No record with data '" + newData.asString() + "' exists"); } @@ -73,7 +75,7 @@ public class MemoryNameService implements NameService { throw new IllegalArgumentException("Cannot update multi-value record '" + record.name().asString() + "' with '" + newData.asString() + "'"); } - Record existing = records.get(0); + var existing = records.get(0); this.records.remove(existing); this.records.add(new Record(existing.type(), existing.name(), newData)); } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java index 1bac0f6cfc1..903ea250935 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/NameService.java @@ -32,10 +32,10 @@ public interface NameService { /** * Create a new TXT record containing the provided data. * @param name Name of the created record - * @param txtData TXT data for the record, consisting of one or more space-separated <em>double-quoted</em> strings: "string1" "string2" - * @return The created record + * @param txtRecords TXT data values for the record, each consisting of one or more space-separated <em>double-quoted</em> strings: "string1" "string2" + * @return The created records */ - Record createTxt(RecordName name, RecordData txtData); + List<Record> createTxtRecords(RecordName name, List<RecordData> txtRecords); /** Find all records matching given type and name */ List<Record> findRecords(Record.Type type, RecordName name); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java index e6aa8bc51b5..a8130d60cc5 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java @@ -98,7 +98,7 @@ public class DeploymentTrigger { report.jobType(), report.applicationId(), report.projectId())); - if ( ! applications().get(report.applicationId()).isPresent()) { + if (applications().get(report.applicationId()).isEmpty()) { log.log(LogLevel.WARNING, "Ignoring completion of job of project '" + report.projectId() + "': Unknown application '" + report.applicationId() + "'"); return; @@ -285,7 +285,7 @@ public class DeploymentTrigger { } private static <T extends Comparable<T>> Optional<T> max(Optional<T> o1, Optional<T> o2) { - return ! o1.isPresent() ? o2 : ! o2.isPresent() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2; + return o1.isEmpty() ? o2 : o2.isEmpty() ? o1 : o1.get().compareTo(o2.get()) >= 0 ? o1 : o2; } // ---------- Ready job computation ---------- @@ -396,11 +396,11 @@ public class DeploymentTrigger { /** Returns whether the given job can trigger at the given instant */ public boolean triggerAt(Instant instant, JobType job, Versions versions, Application application) { Optional<JobStatus> jobStatus = application.deploymentJobs().statusOf(job); - if ( ! jobStatus.isPresent()) return true; + if (jobStatus.isEmpty()) return true; if (jobStatus.get().pausedUntil().isPresent() && jobStatus.get().pausedUntil().getAsLong() > clock.instant().toEpochMilli()) return false; if (jobStatus.get().isSuccess()) return true; // Success - if ( ! jobStatus.get().lastCompleted().isPresent()) return true; // Never completed - if ( ! jobStatus.get().firstFailing().isPresent()) return true; // Should not happen as firstFailing should be set for an unsuccessful job + if (jobStatus.get().lastCompleted().isEmpty()) return true; // Never completed + if (jobStatus.get().firstFailing().isEmpty()) return true; // Should not happen as firstFailing should be set for an unsuccessful job if ( ! versions.targetsMatch(jobStatus.get().lastCompleted().get())) return true; // Always trigger as targets have changed if (application.deploymentSpec().upgradePolicy() == DeploymentSpec.UpgradePolicy.canary) return true; // Don't throttle canaries @@ -516,7 +516,7 @@ public class DeploymentTrigger { if ( ! application.deploymentSpec().canChangeRevisionAt(clock.instant())) return false; if (application.change().application().isPresent()) return true; // Replacing a previous application change is ok. if (application.deploymentJobs().hasFailures()) return true; // Allow changes to fix upgrade problems. - return ! application.change().platform().isPresent(); + return application.change().platform().isEmpty(); } private Change remainingChange(Application application) { @@ -552,7 +552,7 @@ public class DeploymentTrigger { for (JobType jobType : steps(application.deploymentSpec()).testJobs()) { Optional<JobRun> completion = successOn(application, jobType, versions) .filter(run -> versions.sourcesMatchIfPresent(run) || jobType == systemTest); - if ( ! completion.isPresent() && condition.test(jobType)) + if (completion.isEmpty() && condition.test(jobType)) jobs.add(deploymentJob(application, versions, application.change(), jobType, reason, availableSince)); } return jobs; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java index 5bff581c4ce..34e04d966a3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java @@ -237,7 +237,7 @@ public class JobController { if ( ! application.get().deploymentJobs().deployedInternally()) { // TODO jvenstad: Remove when there are no more SDv3 pipelines. // Copy all current packages to the new application store - application.get().deployments().values().stream() + application.get().productionDeployments().values().stream() .map(Deployment::applicationVersion) .distinct() .forEach(appVersion -> { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java index 9133c8980ec..cd3341ed3a6 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirer.java @@ -1,16 +1,12 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.maintenance; -import com.yahoo.config.provision.Environment; import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.Controller; -import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.yolean.Exceptions; -import java.time.Clock; import java.time.Duration; -import java.time.Instant; import java.util.logging.Level; /** @@ -21,41 +17,32 @@ import java.util.logging.Level; */ public class DeploymentExpirer extends Maintainer { - private final Clock clock; - public DeploymentExpirer(Controller controller, Duration interval, JobControl jobControl) { - this(controller, interval, Clock.systemUTC(), jobControl); - } - - public DeploymentExpirer(Controller controller, Duration interval, Clock clock, JobControl jobControl) { super(controller, interval, jobControl); - this.clock = clock; } @Override protected void maintain() { for (Application application : controller().applications().asList()) { for (Deployment deployment : application.deployments().values()) { - if (deployment.zone().environment().equals(Environment.prod)) { - continue; - } - - if (hasExpired(controller().zoneRegistry(), deployment, clock.instant())) { - try { - controller().applications().deactivate(application.id(), deployment.zone()); - } catch (Exception e) { - log.log(Level.WARNING, "Could not expire " + deployment + " of " + application + - ": " + Exceptions.toMessageString(e) + ". Retrying in " + - maintenanceInterval()); - } + if (!isExpired(deployment)) continue; + + try { + controller().applications().deactivate(application.id(), deployment.zone()); + } catch (Exception e) { + log.log(Level.WARNING, "Could not expire " + deployment + " of " + application + + ": " + Exceptions.toMessageString(e) + ". Retrying in " + + maintenanceInterval()); } } } } - private static boolean hasExpired(ZoneRegistry zoneRegistry, Deployment deployment, Instant now) { - return zoneRegistry.getDeploymentTimeToLive(deployment.zone()) - .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(now)) + /** Returns whether given deployment has expired according to its TTL */ + private boolean isExpired(Deployment deployment) { + if (deployment.zone().environment().isProduction()) return false; // Never expire production deployments + return controller().zoneRegistry().getDeploymentTimeToLive(deployment.zone()) + .map(timeToLive -> deployment.at().plus(timeToLive).isBefore(controller().clock().instant())) .orElse(false); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 47ae8566ab8..3c2cbade606 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -47,7 +47,7 @@ import java.util.OptionalLong; import java.util.TreeMap; /** - * Serializes applications to/from slime. + * Serializes {@link Application} to/from slime. * This class is multithread safe. * * @author bratseth diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java index 93dd59e577f..36583f4320e 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java @@ -14,7 +14,7 @@ import java.util.Optional; import java.util.function.Function; /** - * Slime serializer for the audit log. + * Slime serializer for {@link AuditLog}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java index c56d8b3849c..a87875da104 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ConfidenceOverrideSerializer.java @@ -1,7 +1,6 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.persistence; - import com.yahoo.component.Version; import com.yahoo.slime.Cursor; import com.yahoo.slime.ObjectTraverser; @@ -13,7 +12,7 @@ import java.util.LinkedHashMap; import java.util.Map; /** - * Serializes overrides of version confidence. + * Serializer for {@link Confidence} overrides. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java index 36736f7f398..40781ac6e92 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/LogSerializer.java @@ -21,7 +21,7 @@ import java.util.Map; import java.util.stream.Collectors; /** - * Serialisation of LogRecord objects. Not all fields are stored! + * Serialisation of {@link LogEntry} objects. Not all fields are stored! * * @author jonmv */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java index d996b79fe18..21f8b1bcb80 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionSerializer.java @@ -14,7 +14,7 @@ import java.util.Set; import java.util.TreeSet; /** - * Serializer for an OS version. + * Serializer for an {@link OsVersion}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java index b0557863426..3e3c0df1673 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java @@ -20,7 +20,7 @@ import java.util.Objects; import java.util.TreeMap; /** - * Serializer for OS version status. + * Serializer for {@link OsVersionStatus}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java index be464f95385..ce757e015b8 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/RunSerializer.java @@ -50,7 +50,7 @@ import static com.yahoo.vespa.hosted.controller.deployment.Step.endTests; import static java.util.Comparator.comparing; /** - * Serialises and deserialises RunStatus objects for persistent storage. + * Serialises and deserialises {@link Run} objects for persistent storage. * * @author jonmv */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index 2a685914408..56e80068908 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Optional; /** - * Slime serialization of tenants. + * Slime serialization of {@link Tenant} sub-types. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java index 78045a15e9c..5edae803fdb 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionSerializer.java @@ -7,7 +7,7 @@ import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; /** - * Serializer for version numbers. + * Serializer for {@link Version}. * * @author mpolden */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java index 11f0bfcfa0f..72d38bbee5f 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Set; /** - * Serializes VersionStatus to and from slime + * Serializer for {@link VersionStatus}. * * @author mpolden */ diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java index f642f3210b7..730b2943431 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java @@ -3,14 +3,13 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; -import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; -import org.junit.Before; import org.junit.Test; import java.time.Duration; @@ -24,12 +23,7 @@ import static org.junit.Assert.assertEquals; */ public class DeploymentExpirerTest { - private DeploymentTester tester; - - @Before - public void before() { - tester = new DeploymentTester(); - } + private final DeploymentTester tester = new DeploymentTester(); @Test public void testDeploymentExpiry() { @@ -38,7 +32,7 @@ public class DeploymentExpirerTest { Duration.ofDays(14) ); DeploymentExpirer expirer = new DeploymentExpirer(tester.controller(), Duration.ofDays(10), - tester.clock(), new JobControl(new MockCuratorDb())); + new JobControl(new MockCuratorDb())); Application devApp = tester.createApplication("app1", "tenant1", 123L, 1L); Application prodApp = tester.createApplication("app2", "tenant2", 456L, 2L); diff --git a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java index 1b5681e7146..be4aa6cfb41 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java +++ b/document/src/main/java/com/yahoo/document/json/JsonFeedReader.java @@ -9,8 +9,11 @@ import com.yahoo.document.DocumentPut; import com.yahoo.document.DocumentRemove; import com.yahoo.document.DocumentTypeManager; import com.yahoo.document.DocumentUpdate; +import com.yahoo.vespaxmlparser.DocumentFeedOperation; +import com.yahoo.vespaxmlparser.DocumentUpdateFeedOperation; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.FeedReader; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation; +import com.yahoo.vespaxmlparser.RemoveFeedOperation; /** @@ -34,26 +37,23 @@ public class JsonFeedReader implements FeedReader { } @Override - public void read(Operation operation) throws Exception { + public FeedOperation read() throws Exception { DocumentOperation documentOperation = reader.next(); if (documentOperation == null) { stream.close(); - operation.setInvalid(); - return; + return FeedOperation.INVALID; } if (documentOperation instanceof DocumentUpdate) { - operation.setDocumentUpdate((DocumentUpdate) documentOperation); + return new DocumentUpdateFeedOperation((DocumentUpdate) documentOperation, documentOperation.getCondition()); } else if (documentOperation instanceof DocumentRemove) { - operation.setRemove(documentOperation.getId()); + return new RemoveFeedOperation(documentOperation.getId(), documentOperation.getCondition()); } else if (documentOperation instanceof DocumentPut) { - operation.setDocument(((DocumentPut) documentOperation).getDocument()); + return new DocumentFeedOperation(((DocumentPut) documentOperation).getDocument(), documentOperation.getCondition()); } else { throw new IllegalStateException("Got unknown class from JSON reader: " + documentOperation.getClass().getName()); } - - operation.setCondition(documentOperation.getCondition()); } } diff --git a/document/src/main/java/com/yahoo/document/json/JsonWriter.java b/document/src/main/java/com/yahoo/document/json/JsonWriter.java index ab0884a54a3..d7944246ff2 100644 --- a/document/src/main/java/com/yahoo/document/json/JsonWriter.java +++ b/document/src/main/java/com/yahoo/document/json/JsonWriter.java @@ -38,7 +38,33 @@ import java.nio.ByteBuffer; import java.util.Iterator; import java.util.Map; -import static com.yahoo.document.json.JsonSerializationHelper.*; +import static com.yahoo.document.json.JsonSerializationHelper.fieldNameIfNotNull; +import static com.yahoo.document.json.JsonSerializationHelper.serializeArrayField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeBoolField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeByte; +import static com.yahoo.document.json.JsonSerializationHelper.serializeByteArray; +import static com.yahoo.document.json.JsonSerializationHelper.serializeByteBuffer; +import static com.yahoo.document.json.JsonSerializationHelper.serializeByteField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeCollectionField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeDouble; +import static com.yahoo.document.json.JsonSerializationHelper.serializeDoubleField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeFloat; +import static com.yahoo.document.json.JsonSerializationHelper.serializeFloatField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeInt; +import static com.yahoo.document.json.JsonSerializationHelper.serializeIntField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeLong; +import static com.yahoo.document.json.JsonSerializationHelper.serializeLongField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeMapField; +import static com.yahoo.document.json.JsonSerializationHelper.serializePredicateField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeRawField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeReferenceField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeShort; +import static com.yahoo.document.json.JsonSerializationHelper.serializeString; +import static com.yahoo.document.json.JsonSerializationHelper.serializeStringField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeStructField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeStructuredField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeTensorField; +import static com.yahoo.document.json.JsonSerializationHelper.serializeWeightedSet; import static com.yahoo.document.json.document.DocumentParser.FIELDS; import static com.yahoo.document.json.document.DocumentParser.REMOVE; diff --git a/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java b/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java index 8012ebafb13..28aa9ed1d8d 100644 --- a/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java +++ b/document/src/main/java/com/yahoo/document/json/SingleDocumentParser.java @@ -7,7 +7,9 @@ import com.yahoo.document.DocumentPut; import com.yahoo.document.DocumentTypeManager; import com.yahoo.document.DocumentUpdate; import com.yahoo.document.json.document.DocumentParser; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; +import com.yahoo.vespaxmlparser.DocumentFeedOperation; +import com.yahoo.vespaxmlparser.DocumentUpdateFeedOperation; +import com.yahoo.vespaxmlparser.FeedOperation; import java.io.IOException; import java.io.InputStream; @@ -25,32 +27,26 @@ public class SingleDocumentParser { this.docMan = docMan; } - public VespaXMLFeedReader.Operation parsePut(InputStream inputStream, String docId) { + public FeedOperation parsePut(InputStream inputStream, String docId) { return parse(inputStream, docId, DocumentParser.SupportedOperation.PUT); } - public VespaXMLFeedReader.Operation parseUpdate(InputStream inputStream, String docId) { + public FeedOperation parseUpdate(InputStream inputStream, String docId) { return parse(inputStream, docId, DocumentParser.SupportedOperation.UPDATE); } - private VespaXMLFeedReader.Operation parse(InputStream inputStream, String docId, DocumentParser.SupportedOperation supportedOperation) { + private FeedOperation parse(InputStream inputStream, String docId, DocumentParser.SupportedOperation supportedOperation) { final JsonReader reader = new JsonReader(docMan, inputStream, jsonFactory); final DocumentOperation documentOperation = reader.readSingleDocument(supportedOperation, docId); - VespaXMLFeedReader.Operation operation = new VespaXMLFeedReader.Operation(); try { inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } if (supportedOperation == DocumentParser.SupportedOperation.PUT) { - operation.setDocument(((DocumentPut) documentOperation).getDocument()); + return new DocumentFeedOperation(((DocumentPut) documentOperation).getDocument(), documentOperation.getCondition()); } else { - operation.setDocumentUpdate((DocumentUpdate) documentOperation); + return new DocumentUpdateFeedOperation((DocumentUpdate) documentOperation, documentOperation.getCondition()); } - - // (A potentially empty) test-and-set condition is always set by JsonReader - operation.setCondition(documentOperation.getCondition()); - - return operation; } } diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java b/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java index 582a6b0bd92..afdce012b0f 100644 --- a/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java +++ b/document/src/main/java/com/yahoo/document/serialization/DocumentDeserializer.java @@ -15,7 +15,7 @@ public interface DocumentDeserializer extends DocumentReader, DocumentUpdateRead /** * Returns the underlying buffer used for de-serialization. */ - public GrowableByteBuffer getBuf(); + GrowableByteBuffer getBuf(); } diff --git a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java index 4b87edeeded..d95a344be77 100644 --- a/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java +++ b/document/src/main/java/com/yahoo/document/serialization/DocumentUpdateWriter.java @@ -21,15 +21,15 @@ import com.yahoo.document.update.TensorRemoveUpdate; * @since 5.1.27 */ public interface DocumentUpdateWriter { - public void write(DocumentUpdate update); - public void write(FieldUpdate update); - public void write(AddValueUpdate update, DataType superType); - public void write(MapValueUpdate update, DataType superType); - public void write(ArithmeticValueUpdate update); - public void write(AssignValueUpdate update, DataType superType); - public void write(RemoveValueUpdate update, DataType superType); - public void write(ClearValueUpdate clearValueUpdate, DataType superType); - public void write(TensorModifyUpdate update); - public void write(TensorAddUpdate update); - public void write(TensorRemoveUpdate update); + void write(DocumentUpdate update); + void write(FieldUpdate update); + void write(AddValueUpdate update, DataType superType); + void write(MapValueUpdate update, DataType superType); + void write(ArithmeticValueUpdate update); + void write(AssignValueUpdate update, DataType superType); + void write(RemoveValueUpdate update, DataType superType); + void write(ClearValueUpdate clearValueUpdate, DataType superType); + void write(TensorModifyUpdate update); + void write(TensorAddUpdate update); + void write(TensorRemoveUpdate update); } diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java new file mode 100644 index 00000000000..e7a06560532 --- /dev/null +++ b/document/src/main/java/com/yahoo/vespaxmlparser/ConditionalFeedOperation.java @@ -0,0 +1,21 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespaxmlparser; + +import com.yahoo.document.TestAndSetCondition; + +public class ConditionalFeedOperation extends FeedOperation { + private final TestAndSetCondition condition; + protected ConditionalFeedOperation(Type type) { + super(type); + this.condition = TestAndSetCondition.NOT_PRESENT_CONDITION; + } + protected ConditionalFeedOperation(Type type, TestAndSetCondition condition) { + super(type); + this.condition = condition; + } + + @Override + public TestAndSetCondition getCondition() { + return condition; + } +} diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java new file mode 100644 index 00000000000..f3ddbc9196c --- /dev/null +++ b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentFeedOperation.java @@ -0,0 +1,23 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespaxmlparser; + +import com.yahoo.document.Document; +import com.yahoo.document.TestAndSetCondition; + +public class DocumentFeedOperation extends ConditionalFeedOperation { + private final Document document; + public DocumentFeedOperation(Document document) { + super(Type.DOCUMENT); + this.document = document; + } + + public DocumentFeedOperation(Document document, TestAndSetCondition condition) { + super(Type.DOCUMENT, condition); + this.document = document; + } + + @Override + public Document getDocument() { + return document; + } +} diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java new file mode 100644 index 00000000000..af20d72a4e2 --- /dev/null +++ b/document/src/main/java/com/yahoo/vespaxmlparser/DocumentUpdateFeedOperation.java @@ -0,0 +1,22 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespaxmlparser; + +import com.yahoo.document.DocumentUpdate; +import com.yahoo.document.TestAndSetCondition; + +public class DocumentUpdateFeedOperation extends ConditionalFeedOperation { + private final DocumentUpdate update; + public DocumentUpdateFeedOperation(DocumentUpdate update) { + super(Type.UPDATE); + this.update = update; + } + public DocumentUpdateFeedOperation(DocumentUpdate update, TestAndSetCondition condition) { + super(Type.UPDATE, condition); + this.update = update; + } + + @Override + public DocumentUpdate getDocumentUpdate() { + return update; + } +} diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java new file mode 100644 index 00000000000..9da3408da61 --- /dev/null +++ b/document/src/main/java/com/yahoo/vespaxmlparser/FeedOperation.java @@ -0,0 +1,39 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespaxmlparser; + +import com.yahoo.document.Document; +import com.yahoo.document.DocumentId; +import com.yahoo.document.DocumentUpdate; +import com.yahoo.document.TestAndSetCondition; + +public class FeedOperation { + public enum Type {DOCUMENT, REMOVE, UPDATE, INVALID} + public static final FeedOperation INVALID = new FeedOperation(Type.INVALID); + + private Type type; + protected FeedOperation(Type type) { + this.type = type; + } + public final Type getType() { return type; } + protected final void setType(Type type) { + this.type = type; + } + + public Document getDocument() { return null; } + public DocumentUpdate getDocumentUpdate() { return null; } + public DocumentId getRemove() { return null; } + + public TestAndSetCondition getCondition() { + return TestAndSetCondition.NOT_PRESENT_CONDITION; + } + @Override + public String toString() { + return "Operation{" + + "type=" + getType() + + ", doc=" + getDocument() + + ", remove=" + getRemove() + + ", docUpdate=" + getDocumentUpdate() + + " testandset=" + getCondition() + + '}'; + } +}
\ No newline at end of file diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java index 2c130cae782..c993d5a5153 100644 --- a/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java +++ b/document/src/main/java/com/yahoo/vespaxmlparser/FeedReader.java @@ -1,8 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespaxmlparser; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation; - /** * Minimal interface for reading operations from a stream for a feeder. * @@ -14,8 +12,7 @@ public interface FeedReader { /** * Reads the next operation from the stream. - * @param operation The operation to fill in. Operation is unchanged if none was found. + * @return operation, possibly invalid if none was found. */ - void read(Operation operation) throws Exception; - + FeedOperation read() throws Exception; } diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java b/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java new file mode 100644 index 00000000000..782a6295ee1 --- /dev/null +++ b/document/src/main/java/com/yahoo/vespaxmlparser/RemoveFeedOperation.java @@ -0,0 +1,22 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespaxmlparser; + +import com.yahoo.document.DocumentId; +import com.yahoo.document.TestAndSetCondition; + +public class RemoveFeedOperation extends ConditionalFeedOperation { + private final DocumentId documentId; + public RemoveFeedOperation(DocumentId documentId) { + super(Type.REMOVE); + this.documentId = documentId; + } + public RemoveFeedOperation(DocumentId documentId, TestAndSetCondition condition) { + super(Type.REMOVE, condition); + this.documentId = documentId; + } + + @Override + public DocumentId getRemove() { + return documentId; + } +} diff --git a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java index e0213b4c88d..7bc0cc871ca 100644 --- a/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java +++ b/document/src/main/java/com/yahoo/vespaxmlparser/VespaXMLFeedReader.java @@ -74,89 +74,6 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { } } - public enum OperationType { - DOCUMENT, - REMOVE, - UPDATE, - INVALID - } - - /** - * Represents a feed operation found by the parser. Can be one of the following types: - * - getType() == DOCUMENT: getDocument() is valid. - * - getType() == REMOVE: getRemove() is valid. - * - getType() == UPDATE: getUpdate() is valid. - */ - public static class Operation { - - private OperationType type; - private Document doc; - private DocumentId remove; - private DocumentUpdate docUpdate; - private TestAndSetCondition condition; - - public Operation() { - setInvalid(); - } - - public void setInvalid() { - type = OperationType.INVALID; - doc = null; - remove = null; - docUpdate = null; - condition = null; - } - - public OperationType getType() { - return type; - } - - public Document getDocument() { - return doc; - } - - public void setDocument(Document doc) { - this.type = OperationType.DOCUMENT; - this.doc = doc; - } - - public DocumentId getRemove() { - return remove; - } - - public void setRemove(DocumentId remove) { - this.type = OperationType.REMOVE; - this.remove = remove; - } - - public DocumentUpdate getDocumentUpdate() { - return docUpdate; - } - - public void setDocumentUpdate(DocumentUpdate docUpdate) { - this.type = OperationType.UPDATE; - this.docUpdate = docUpdate; - } - - public void setCondition(TestAndSetCondition condition) { - this.condition = condition; - } - - public TestAndSetCondition getCondition() { - return condition; - } - - @Override - public String toString() { - return "Operation{" + - "type=" + type + - ", doc=" + doc + - ", remove=" + remove + - ", docUpdate=" + docUpdate + - '}'; - } - } - /** * <p>Reads all operations from the XML stream and puts into a list. Note * that if the XML stream is large, this may cause out of memory errors, so @@ -164,12 +81,11 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { * * @return The list of all read operations. */ - public List<Operation> readAll() throws Exception { - List<Operation> list = new ArrayList<>(); + public List<FeedOperation> readAll() throws Exception { + List<FeedOperation> list = new ArrayList<>(); while (true) { - Operation op = new Operation(); - read(op); - if (op.getType() == OperationType.INVALID) { + FeedOperation op = read(); + if (op.getType() == FeedOperation.Type.INVALID) { return list; } else { list.add(op); @@ -181,10 +97,8 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { * @see com.yahoo.vespaxmlparser.FeedReader#read(com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation) */ @Override - public void read(Operation operation) throws Exception { + public FeedOperation read() throws Exception { String startTag = null; - operation.setInvalid(); - try { while (reader.hasNext()) { int type = reader.next(); @@ -195,36 +109,28 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { if ("document".equals(startTag)) { VespaXMLDocumentReader documentReader = new VespaXMLDocumentReader(reader, docTypeManager); Document document = new Document(documentReader); - operation.setDocument(document); - operation.setCondition(TestAndSetCondition.fromConditionString(documentReader.getCondition())); - return; + return new DocumentFeedOperation(document, TestAndSetCondition.fromConditionString(documentReader.getCondition())); } else if ("update".equals(startTag)) { VespaXMLUpdateReader updateReader = new VespaXMLUpdateReader(reader, docTypeManager); DocumentUpdate update = new DocumentUpdate(updateReader); - operation.setDocumentUpdate(update); - operation.setCondition(TestAndSetCondition.fromConditionString(updateReader.getCondition())); - return; + return new DocumentUpdateFeedOperation(update, TestAndSetCondition.fromConditionString(updateReader.getCondition())); } else if ("remove".equals(startTag)) { - boolean documentIdFound = false; + DocumentId documentId = null; Optional<String> condition = Optional.empty(); for (int i = 0; i < reader.getAttributeCount(); i++) { final String attributeName = reader.getAttributeName(i).toString(); if ("documentid".equals(attributeName) || "id".equals(attributeName)) { - operation.setRemove(new DocumentId(reader.getAttributeValue(i))); - documentIdFound = true; + documentId = new DocumentId(reader.getAttributeValue(i)); } else if ("condition".equals(attributeName)) { condition = Optional.of(reader.getAttributeValue(i)); } } - if (!documentIdFound) { + if (documentId == null) { throw newDeserializeException("Missing \"documentid\" attribute for remove operation"); } - - operation.setCondition(TestAndSetCondition.fromConditionString(condition)); - - return; + return new RemoveFeedOperation(documentId, TestAndSetCondition.fromConditionString(condition)); } else { throw newDeserializeException("Element \"" + startTag + "\" not allowed in this context"); } @@ -243,6 +149,7 @@ public class VespaXMLFeedReader extends VespaXMLReader implements FeedReader { throw(e); } + return FeedOperation.INVALID; } } diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java index a7fd782484e..e2aafcb4fdc 100644 --- a/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java +++ b/document/src/test/java/com/yahoo/vespaxmlparser/PositionParserTestCase.java @@ -26,7 +26,7 @@ public class PositionParserTestCase { mgr.registerDocumentType(docType); VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_position.xml", mgr); - Iterator<VespaXMLFeedReader.Operation> it = parser.readAll().iterator(); + Iterator<FeedOperation> it = parser.readAll().iterator(); assertTrue(it.hasNext()); assertDocument(PositionDataType.valueOf(1, 2), it.next()); assertTrue(it.hasNext()); @@ -38,9 +38,9 @@ public class PositionParserTestCase { assertFalse(it.hasNext()); } - private static void assertDocument(Struct expected, VespaXMLFeedReader.Operation operation) { + private static void assertDocument(Struct expected, FeedOperation operation) { assertNotNull(operation); - assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, operation.getType()); + assertEquals(FeedOperation.Type.DOCUMENT, operation.getType()); Document doc = operation.getDocument(); assertNotNull(doc); assertEquals(expected, doc.getFieldValue("my_pos")); diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java index dcdea0975ad..0ccae4dbde5 100644 --- a/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java +++ b/document/src/test/java/com/yahoo/vespaxmlparser/UriParserTestCase.java @@ -28,7 +28,7 @@ public class UriParserTestCase { mgr.registerDocumentType(docType); VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_uri.xml", mgr); - Iterator<VespaXMLFeedReader.Operation> it = parser.readAll().iterator(); + Iterator<FeedOperation> it = parser.readAll().iterator(); Document doc = nextDocument(it); assertNotNull(doc); @@ -59,21 +59,21 @@ public class UriParserTestCase { assertFalse(it.hasNext()); } - private static Document nextDocument(Iterator<VespaXMLFeedReader.Operation> it) { + private static Document nextDocument(Iterator<FeedOperation> it) { assertTrue(it.hasNext()); - VespaXMLFeedReader.Operation op = it.next(); + FeedOperation op = it.next(); assertNotNull(op); - assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, op.getType()); + assertEquals(FeedOperation.Type.DOCUMENT, op.getType()); Document doc = op.getDocument(); assertNotNull(doc); return doc; } - private static DocumentUpdate nextUpdate(Iterator<VespaXMLFeedReader.Operation> it) { + private static DocumentUpdate nextUpdate(Iterator<FeedOperation> it) { assertTrue(it.hasNext()); - VespaXMLFeedReader.Operation op = it.next(); + FeedOperation op = it.next(); assertNotNull(op); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate upd = op.getDocumentUpdate(); assertNotNull(upd); return upd; diff --git a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java index 29567177642..e33dbfe8898 100755 --- a/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java +++ b/document/src/test/java/com/yahoo/vespaxmlparser/VespaXMLReaderTestCase.java @@ -40,7 +40,7 @@ public class VespaXMLReaderTestCase { } @Test - public void testMapNoKey() throws Exception { + public void testMapNoKey() { try { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testmapnokey.xml", manager); parser.readAll(); @@ -51,7 +51,7 @@ public class VespaXMLReaderTestCase { } @Test - public void testMapNoValue() throws Exception { + public void testMapNoValue() { try { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testmapnovalue.xml", manager); parser.readAll(); @@ -64,10 +64,9 @@ public class VespaXMLReaderTestCase { @Test public void testNews1() throws Exception { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/testalltypes.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertTrue(VespaXMLFeedReader.OperationType.INVALID != op.getType()); + assertTrue(FeedOperation.Type.INVALID != op.getType()); Document doc = op.getDocument(); assertEquals(new StringFieldValue("testUrl"), doc.getFieldValue("url")); assertEquals(new StringFieldValue("testTitle"), doc.getFieldValue("title")); @@ -149,10 +148,9 @@ public class VespaXMLReaderTestCase { public void testNews3() throws Exception { // Updating all elements in a documentType VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test03.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); @@ -214,10 +212,9 @@ public class VespaXMLReaderTestCase { // Test on adding just a few fields to a DocumentUpdate (implies other fields to null) VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test04.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); //url @@ -269,10 +266,9 @@ public class VespaXMLReaderTestCase { // Adding a few new fields to a Document using different syntax VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test05.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); @@ -334,20 +330,19 @@ public class VespaXMLReaderTestCase { // long value with txt try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); } // empty string - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); assertEquals("doc:news:http://news6b", op.getDocument().getId().toString()); // int array with text try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -355,7 +350,7 @@ public class VespaXMLReaderTestCase { // long array with whitespace try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -363,7 +358,7 @@ public class VespaXMLReaderTestCase { // byte array with value try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -371,7 +366,7 @@ public class VespaXMLReaderTestCase { // float array with string try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -379,7 +374,7 @@ public class VespaXMLReaderTestCase { // weighted set of int with string try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -387,7 +382,7 @@ public class VespaXMLReaderTestCase { // weighted set of int with string as weight try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -395,17 +390,17 @@ public class VespaXMLReaderTestCase { // weighted set of string with string as weight try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); } - parser.read(op = new VespaXMLFeedReader.Operation()); + op = parser.read(); assertEquals("doc:news:http://news6j", op.getDocument().getId().toString()); - parser.read(op = new VespaXMLFeedReader.Operation()); - assertEquals(VespaXMLFeedReader.OperationType.INVALID, op.getType()); + op = parser.read(); + assertEquals(FeedOperation.Type.INVALID, op.getType()); } @Test @@ -414,10 +409,9 @@ public class VespaXMLReaderTestCase { // are also some updates that will fail (be skipped). VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test07.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); @@ -449,7 +443,7 @@ public class VespaXMLReaderTestCase { // Trying arithmetic on string (b) try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -457,7 +451,7 @@ public class VespaXMLReaderTestCase { // "By" as string (c) try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -465,7 +459,7 @@ public class VespaXMLReaderTestCase { // Empty key in weighted set of int (d) try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -473,7 +467,7 @@ public class VespaXMLReaderTestCase { // No "by" attribute (e) try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -481,7 +475,7 @@ public class VespaXMLReaderTestCase { // Float key as string (f) try { - parser.read(new VespaXMLFeedReader.Operation()); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -492,10 +486,9 @@ public class VespaXMLReaderTestCase { public void testNews8() throws Exception { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test08.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); @@ -518,24 +511,21 @@ public class VespaXMLReaderTestCase { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test09.xml", manager); { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.REMOVE, op.getType()); + assertEquals(FeedOperation.Type.REMOVE, op.getType()); assertEquals("doc:news:http://news9a", op.getRemove().toString()); } { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.REMOVE, op.getType()); + assertEquals(FeedOperation.Type.REMOVE, op.getType()); assertEquals("doc:news:http://news9b", op.getRemove().toString()); } { // Remove without documentid. Not supported. - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); try { - parser.read(op); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -547,8 +537,7 @@ public class VespaXMLReaderTestCase { public void testNews10() throws Exception { VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test10.xml", manager); { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); Document doc = op.getDocument(); assertEquals(new StringFieldValue("testUrl"), doc.getFieldValue("url")); @@ -585,15 +574,13 @@ public class VespaXMLReaderTestCase { assertEquals(Integer.valueOf(14), strWset.get(new StringFieldValue("string14"))); } { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); Document doc = op.getDocument(); assertNotNull(doc); assertEquals(new StringFieldValue("testUrl2"), doc.getFieldValue("url")); } { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); DocumentUpdate upd = op.getDocumentUpdate(); assertNull(upd.getFieldUpdate("url")); @@ -629,8 +616,7 @@ public class VespaXMLReaderTestCase { .getWeight()); } { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); DocumentUpdate upd = op.getDocumentUpdate(); assertEquals(new StringFieldValue("assignUrl"), @@ -661,15 +647,13 @@ public class VespaXMLReaderTestCase { assertNull(upd.getFieldUpdate("weightedsetstring")); } { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); assertEquals("doc:news:http://news10e", op.getRemove().toString()); } { // Illegal remove without documentid attribute try { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + parser.read(); fail(); } catch (Exception e) { System.out.println(e.getMessage()); @@ -682,10 +666,9 @@ public class VespaXMLReaderTestCase { // Adding a few new fields to a Document using different syntax VespaXMLFeedReader parser = new VespaXMLFeedReader("src/tests/vespaxml/fieldpathupdates.xml", manager); - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); - assertEquals(VespaXMLFeedReader.OperationType.UPDATE, op.getType()); + assertEquals(FeedOperation.Type.UPDATE, op.getType()); DocumentUpdate docUpdate = op.getDocumentUpdate(); @@ -801,13 +784,13 @@ public class VespaXMLReaderTestCase { .configure(m, "file:src/test/java/com/yahoo/document/documentmanager.docindoc.cfg"); VespaXMLFeedReader parser = new VespaXMLFeedReader("src/test/vespaxmlparser/test_docindoc.xml", m); - List<VespaXMLFeedReader.Operation> ops = parser.readAll(); + List<FeedOperation> ops = parser.readAll(); assertEquals(1, ops.size()); - VespaXMLFeedReader.Operation op = ops.get(0); + FeedOperation op = ops.get(0); System.err.println(op); - assertEquals(VespaXMLFeedReader.OperationType.DOCUMENT, op.getType()); + assertEquals(FeedOperation.Type.DOCUMENT, op.getType()); assertNull(op.getRemove()); assertNull(op.getDocumentUpdate()); assertNotNull(op.getDocument()); @@ -886,8 +869,7 @@ public class VespaXMLReaderTestCase { final int NUM_OPERATIONS_IN_FEED = 3; for (int i = 0; i < NUM_OPERATIONS_IN_FEED; i++) { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - parser.read(op); + FeedOperation op = parser.read(); assertTrue("Missing test and set condition", op.getCondition().isPresent()); assertEquals("Condition is not the same as in xml feed", "news.value_long == 1", op.getCondition().getSelection()); diff --git a/document/src/tests/datatype/datatype_test.cpp b/document/src/tests/datatype/datatype_test.cpp index ef41ee770a2..fff913a0f91 100644 --- a/document/src/tests/datatype/datatype_test.cpp +++ b/document/src/tests/datatype/datatype_test.cpp @@ -94,13 +94,6 @@ TEST_F("require that TensorDataType can check for assignable tensor type", Tenso EXPECT_TRUE(f.isAssignableType("tensor(x[2])")); EXPECT_FALSE(f.isAssignableType("tensor(x[3])")); EXPECT_FALSE(f.isAssignableType("tensor(y[2])")); - EXPECT_FALSE(f.isAssignableType("tensor(x[])")); - EXPECT_FALSE(f.isAssignableType("tensor(x{})")); - f.setup("tensor(x[])"); - EXPECT_TRUE(f.isAssignableType("tensor(x[2])")); - EXPECT_TRUE(f.isAssignableType("tensor(x[3])")); - EXPECT_FALSE(f.isAssignableType("tensor(y[2])")); - EXPECT_FALSE(f.isAssignableType("tensor(x[])")); EXPECT_FALSE(f.isAssignableType("tensor(x{})")); } diff --git a/documentapi/abi-spec.json b/documentapi/abi-spec.json index e1e5f778423..415c9df1e77 100644 --- a/documentapi/abi-spec.json +++ b/documentapi/abi-spec.json @@ -1441,44 +1441,6 @@ ], "fields": [] }, - "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState": { - "superClass": "java.lang.Enum", - "interfaces": [], - "attributes": [ - "public", - "final", - "enum" - ], - "methods": [ - "public static com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState[] values()", - "public static com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState valueOf(java.lang.String)" - ], - "fields": [ - "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState NOT_STARTED", - "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState RUNNING", - "public static final enum com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy$InitState DONE" - ] - }, - "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy": { - "superClass": "java.lang.Object", - "interfaces": [ - "com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy", - "java.lang.Runnable" - ], - "attributes": [ - "public", - "abstract" - ], - "methods": [ - "public static java.util.Map parse(java.lang.String)", - "public abstract void init()", - "public abstract void doSelect(com.yahoo.messagebus.routing.RoutingContext)", - "public void select(com.yahoo.messagebus.routing.RoutingContext)", - "public void run()", - "public void destroy()" - ], - "fields": [] - }, "com.yahoo.documentapi.messagebus.protocol.ContentPolicy$ContentParameters": { "superClass": "com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters", "interfaces": [], @@ -2025,25 +1987,6 @@ ], "fields": [] }, - "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy": { - "superClass": "com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy", - "interfaces": [ - "com.yahoo.config.subscription.ConfigSubscriber$SingleSubscriber" - ], - "attributes": [ - "public", - "abstract" - ], - "methods": [ - "public void init()", - "public com.yahoo.jrt.slobrok.api.IMirror getMirror()", - "public java.util.List lookup(com.yahoo.messagebus.routing.RoutingContext, java.lang.String)", - "public synchronized void configure(com.yahoo.cloud.config.SlobroksConfig)", - "public void destroy()", - "public bridge synthetic void configure(com.yahoo.config.ConfigInstance)" - ], - "fields": [] - }, "com.yahoo.documentapi.messagebus.protocol.GetBucketListMessage": { "superClass": "com.yahoo.documentapi.messagebus.protocol.DocumentMessage", "interfaces": [], @@ -2212,14 +2155,15 @@ "fields": [] }, "com.yahoo.documentapi.messagebus.protocol.LoadBalancerPolicy": { - "superClass": "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy", + "superClass": "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy", "interfaces": [], "attributes": [ "public" ], "methods": [ - "public void doSelect(com.yahoo.messagebus.routing.RoutingContext)", - "public void merge(com.yahoo.messagebus.routing.RoutingContext)" + "public void select(com.yahoo.messagebus.routing.RoutingContext)", + "public void merge(com.yahoo.messagebus.routing.RoutingContext)", + "public void destroy()" ], "fields": [] }, @@ -2955,6 +2899,22 @@ ], "fields": [] }, + "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy": { + "superClass": "java.lang.Object", + "interfaces": [ + "com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy" + ], + "attributes": [ + "public", + "abstract" + ], + "methods": [ + "public void <init>()", + "protected java.util.List lookup(com.yahoo.messagebus.routing.RoutingContext, java.lang.String)", + "public static java.util.Map parse(java.lang.String)" + ], + "fields": [] + }, "com.yahoo.documentapi.messagebus.protocol.StatBucketMessage": { "superClass": "com.yahoo.documentapi.messagebus.protocol.DocumentMessage", "interfaces": [], @@ -3017,7 +2977,7 @@ "abstract" ], "methods": [ - "public void <init>()", + "protected void <init>(int)", "public abstract java.lang.String getTargetSpec(java.lang.Integer, com.yahoo.messagebus.routing.RoutingContext)", "public void close()" ], @@ -3033,11 +2993,10 @@ ], "methods": [ "public void <init>(java.util.Map)", - "public java.lang.String getDistributionConfigId()", "public java.lang.String getClusterName()", "public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$SlobrokHostPatternGenerator createPatternGenerator()", - "public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$HostFetcher createHostFetcher(com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy)", - "public com.yahoo.vdslib.distribution.Distribution createDistribution(com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy)" + "public com.yahoo.documentapi.messagebus.protocol.StoragePolicy$HostFetcher createHostFetcher(com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy, int)", + "public com.yahoo.vdslib.distribution.Distribution createDistribution(com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy)" ], "fields": [ "protected final java.lang.String clusterName", @@ -3069,7 +3028,7 @@ "fields": [] }, "com.yahoo.documentapi.messagebus.protocol.StoragePolicy": { - "superClass": "com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy", + "superClass": "com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy", "interfaces": [], "attributes": [ "public" @@ -3077,9 +3036,8 @@ "methods": [ "public void <init>(java.lang.String)", "public void <init>(java.util.Map)", - "public void <init>(com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters, java.util.Map)", - "public void init()", - "public void doSelect(com.yahoo.messagebus.routing.RoutingContext)", + "public void <init>(com.yahoo.documentapi.messagebus.protocol.StoragePolicy$Parameters)", + "public void select(com.yahoo.messagebus.routing.RoutingContext)", "public void merge(com.yahoo.messagebus.routing.RoutingContext)", "public void destroy()" ], diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java deleted file mode 100644 index 90fc6de57c7..00000000000 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/AsyncInitializationPolicy.java +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.documentapi.messagebus.protocol; - -import com.yahoo.log.LogLevel; -import com.yahoo.messagebus.EmptyReply; -import com.yahoo.messagebus.ErrorCode; -import com.yahoo.messagebus.Reply; -import com.yahoo.messagebus.routing.RoutingContext; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.logging.Logger; - -/** - * Abstract class for routing policies that need asynchronous initialization. - * This is recommended if the routing policy needs configuration, or synchronization with - * other sources. If this policy is not used in those cases, the messagebus thread might hang - * waiting for the other sources, causing messages to other routes to be blocked. - */ -public abstract class AsyncInitializationPolicy implements DocumentProtocolRoutingPolicy, Runnable { - - protected enum InitState { - NOT_STARTED, - RUNNING, - DONE - } - - private static final Logger log = Logger.getLogger(AsyncInitializationPolicy.class.getName()); - - private InitState initState; - private ScheduledThreadPoolExecutor executor; - private Exception initException; - private boolean syncInit = true; - - public static Map<String, String> parse(String param) { - Map<String, String> map = new TreeMap<>(); - - if (param != null) { - String[] p = param.split(";"); - for (String s : p) { - String[] keyValue = s.split("="); - - if (keyValue.length == 1) { - map.put(keyValue[0], "true"); - } else if (keyValue.length == 2) { - map.put(keyValue[0], keyValue[1]); - } - } - } - - return map; - } - - AsyncInitializationPolicy() { - initState = InitState.NOT_STARTED; - } - - void needAsynchronousInitialization() { - syncInit = false; - } - - public abstract void init(); - - public abstract void doSelect(RoutingContext routingContext); - - private synchronized void checkStartInit() { - if (initState == InitState.NOT_STARTED) { - if (syncInit) { - init(); - initState = InitState.DONE; - } else { - executor = new ScheduledThreadPoolExecutor(1); - executor.execute(this); - initState = InitState.RUNNING; - } - } - } - - @Override - public void select(RoutingContext routingContext) { - synchronized (this) { - if (initException != null) { - Reply reply = new EmptyReply(); - reply.addError(new com.yahoo.messagebus.Error(ErrorCode.POLICY_ERROR, "Policy threw exception during init:" + exceptionMessageWithTrace(initException))); - routingContext.setReply(reply); - return; - } - - checkStartInit(); - - if (initState == InitState.RUNNING) { - Reply reply = new EmptyReply(); - reply.addError(new com.yahoo.messagebus.Error(ErrorCode.SESSION_BUSY, "Policy is waiting to be initialized.")); - routingContext.setReply(reply); - return; - } - } - - doSelect(routingContext); - } - - public void run() { - try { - init(); - } catch (Exception e) { - log.log(LogLevel.WARNING,"Init threw exception",e); - initException = e; - } - - synchronized (this) { - initState = InitState.DONE; - this.notifyAll(); - } - } - - @Override - public void destroy() { - if (executor != null) { - executor.shutdownNow(); - } - } - - - private static String exceptionMessageWithTrace(Exception e) { - StringWriter sw = new StringWriter(); - try (PrintWriter pw = new PrintWriter(sw)) { - e.printStackTrace(pw); - pw.flush(); - } - return sw.toString(); - - } - - - -} diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java index 3ece2217601..d6e20b9d57f 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java @@ -33,7 +33,7 @@ public class ContentPolicy extends StoragePolicy { } public ContentPolicy(Map<String, String> params) { - super(new ContentParameters(params), params); + super(new ContentParameters(params)); } public ContentPolicy(String parameters) { diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java index 77bc904ab12..450f53c4440 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocolRoutingPolicy.java @@ -3,7 +3,6 @@ package com.yahoo.documentapi.messagebus.protocol; import com.yahoo.messagebus.routing.RoutingPolicy; - /** * @author thomasg */ diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java deleted file mode 100644 index 39242bb6cab..00000000000 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ExternalSlobrokPolicy.java +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.documentapi.messagebus.protocol; - -import com.yahoo.config.subscription.ConfigSourceSet; -import com.yahoo.config.subscription.ConfigSubscriber; -import com.yahoo.jrt.Supervisor; -import com.yahoo.jrt.Transport; -import com.yahoo.jrt.slobrok.api.IMirror; -import com.yahoo.jrt.slobrok.api.Mirror; -import com.yahoo.jrt.slobrok.api.SlobrokList; -import com.yahoo.messagebus.routing.RoutingContext; -import com.yahoo.cloud.config.SlobroksConfig; - -import java.util.List; -import java.util.Map; - -/** - * Abstract class for policies that allow you to specify which slobrok to use for the - * routing. - */ -public abstract class ExternalSlobrokPolicy extends AsyncInitializationPolicy implements ConfigSubscriber.SingleSubscriber<SlobroksConfig> { - String error; - private Supervisor orb = null; - private Mirror mirror = null; - private SlobrokList slobroks = null; - private boolean firstTry = true; - private ConfigSubscriber subscriber; - String[] configSources = null; - private final static String slobrokConfigId = "admin/slobrok.0"; - - - ExternalSlobrokPolicy(Map<String, String> param) { - super(); - - String conf = param.get("config"); - if (conf != null) { - configSources = conf.split(","); - } - - String slbrk = param.get("slobroks"); - if (slbrk != null) { - slobroks = new SlobrokList(); - slobroks.setup(slbrk.split(",")); - } - - if (slobroks != null || configSources != null) { - needAsynchronousInitialization(); - } - } - - @Override - public void init() { - if (slobroks != null) { - orb = new Supervisor(new Transport()); - mirror = new Mirror(orb, slobroks); - } - - if (configSources != null) { - if (mirror == null) { - orb = new Supervisor(new Transport()); - subscriber = subscribe(slobrokConfigId, new ConfigSourceSet(configSources)); - } - } - } - - private ConfigSubscriber subscribe(String configId, final ConfigSourceSet configSourceSet) { - ConfigSubscriber subscriber = new ConfigSubscriber(configSourceSet); - subscriber.subscribe(this, SlobroksConfig.class, configId); - return subscriber; - } - - public IMirror getMirror() { - return mirror; - } - - public List<Mirror.Entry> lookup(RoutingContext context, String pattern) { - IMirror mirror1 = (mirror != null ? mirror : context.getMirror()); - - List<Mirror.Entry> arr = mirror1.lookup(pattern); - - if ((arr.isEmpty()) && firstTry) { - synchronized(this) { - try { - int count = 0; - while (arr.isEmpty() && count < 100) { - Thread.sleep(50); - arr = mirror1.lookup(pattern); - count++; - } - } catch (InterruptedException e) { - } - - } - } - - firstTry = false; - return arr; - } - - @Override - public synchronized void configure(SlobroksConfig config) { - String[] slist = new String[config.slobrok().size()]; - - for(int i = 0; i < config.slobrok().size(); i++) { - slist[i] = config.slobrok(i).connectionspec(); - } - if (slobroks == null) { - slobroks = new SlobrokList(); - } - slobroks.setup(slist); - if (mirror == null) { - mirror = new Mirror(orb, slobroks); - } - - } - - @Override - public void destroy() { - if (subscriber!=null) subscriber.close(); - } - -} diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java index a2875f14ab5..054b120cf81 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancer.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.documentapi.messagebus.protocol; +import com.google.common.util.concurrent.AtomicDouble; import com.yahoo.jrt.slobrok.api.Mirror; import java.util.List; @@ -28,10 +29,10 @@ public class LoadBalancer { } /** Statistics on each node we are load balancing over. Populated lazily. */ - private List<NodeMetrics> nodeWeights = new CopyOnWriteArrayList<>(); + private final List<NodeMetrics> nodeWeights = new CopyOnWriteArrayList<>(); - private String cluster; - private double position = 0.0; + private final String cluster; + private final AtomicDouble safePosition = new AtomicDouble(0.0); public LoadBalancer(String cluster) { this.cluster = cluster; @@ -67,6 +68,7 @@ public class LoadBalancer { double weightSum = 0.0; Node selectedNode = null; + double position = safePosition.get(); for (Mirror.Entry entry : choices) { NodeMetrics nodeMetrics = getNodeMetrics(entry); @@ -82,6 +84,7 @@ public class LoadBalancer { selectedNode = new Node(choices.get(0), getNodeMetrics(choices.get(0))); } position += 1.0; + safePosition.set(position); selectedNode.metrics.sent.incrementAndGet(); return selectedNode; } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java index 9cf82144e71..3d129684465 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/LoadBalancerPolicy.java @@ -23,32 +23,28 @@ import java.util.Map; * * @author <a href="mailto:humbe@yahoo-inc.com">Haakon Humberset</a> */ -public class LoadBalancerPolicy extends ExternalSlobrokPolicy { +public class LoadBalancerPolicy extends SlobrokPolicy { private final String session; private final String pattern; - private LoadBalancer loadBalancer; + private final LoadBalancer loadBalancer; LoadBalancerPolicy(String param) { this(parse(param)); } private LoadBalancerPolicy(Map<String, String> params) { - super(params); + super(); String cluster = params.get("cluster"); session = params.get("session"); if (cluster == null) { - error = "Required parameter pattern not set"; - pattern = null; - return; + throw new IllegalArgumentException("Required parameter 'cluster' not set"); } if (session == null) { - error = "Required parameter session not set"; - pattern = null; - return; + throw new IllegalArgumentException("Required parameter 'session' not set"); } pattern = cluster + "/*/" + session; @@ -56,7 +52,7 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy { } @Override - public void doSelect(RoutingContext context) { + public void select(RoutingContext context) { LoadBalancer.Node node = getRecipient(context); if (node != null) { @@ -65,8 +61,7 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy { route.setHop(0, Hop.parse(node.entry.getSpec() + "/" + session)); context.addChild(route); } else { - context.setError(ErrorCode.NO_ADDRESS_FOR_SERVICE, - "Could not resolve any nodes to send to in pattern " + pattern); + context.setError(ErrorCode.NO_ADDRESS_FOR_SERVICE, "Could not resolve any nodes to send to in pattern " + pattern); } } @@ -95,4 +90,9 @@ public class LoadBalancerPolicy extends ExternalSlobrokPolicy { context.setReply(reply); } + + @Override + public void destroy() { + + } } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java new file mode 100644 index 00000000000..f4e1bb33dd1 --- /dev/null +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java @@ -0,0 +1,63 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.documentapi.messagebus.protocol; + +import com.yahoo.jrt.slobrok.api.IMirror; +import com.yahoo.jrt.slobrok.api.Mirror; +import com.yahoo.messagebus.routing.RoutingContext; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Abstract class for policies that allow you to specify which slobrok to use for the + * routing. + */ +public abstract class SlobrokPolicy implements DocumentProtocolRoutingPolicy { + private boolean firstTry = true; + + protected List<Mirror.Entry> lookup(RoutingContext context, String pattern) { + IMirror mirror1 = context.getMirror(); + + List<Mirror.Entry> arr = mirror1.lookup(pattern); + + if (arr.isEmpty()) { + synchronized(this) { + if (firstTry) { + try { + int count = 0; + while (arr.isEmpty() && count < 100) { + Thread.sleep(50); + arr = mirror1.lookup(pattern); + count++; + } + } catch (InterruptedException e) { + } + firstTry = true; + } + } + } + + return arr; + } + + public static Map<String, String> parse(String param) { + Map<String, String> map = new TreeMap<>(); + + if (param != null) { + String[] p = param.split(";"); + for (String s : p) { + String[] keyValue = s.split("="); + + if (keyValue.length == 1) { + map.put(keyValue[0], "true"); + } else if (keyValue.length == 2) { + map.put(keyValue[0], keyValue[1]); + } + } + } + + return map; + } + +} diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java index 048149e86ab..918bd193d89 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java @@ -2,7 +2,6 @@ package com.yahoo.documentapi.messagebus.protocol; import com.yahoo.concurrent.CopyOnWriteHashMap; -import com.yahoo.config.subscription.ConfigSourceSet; import com.yahoo.document.BucketId; import com.yahoo.document.BucketIdFactory; import com.yahoo.jrt.slobrok.api.IMirror; @@ -25,10 +24,14 @@ import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; /** @@ -42,7 +45,7 @@ import java.util.logging.Logger; * * @author Haakon Humberset */ -public class StoragePolicy extends ExternalSlobrokPolicy { +public class StoragePolicy extends SlobrokPolicy { private static final Logger log = Logger.getLogger(StoragePolicy.class.getName()); public static final String owningBucketStates = "uim"; @@ -50,46 +53,65 @@ public class StoragePolicy extends ExternalSlobrokPolicy { /** This class merely generates slobrok a host pattern for a given distributor. */ public static class SlobrokHostPatternGenerator { - private final String clusterName; - SlobrokHostPatternGenerator(String clusterName) { this.clusterName = clusterName; } + private final String base; + private final String all; + SlobrokHostPatternGenerator(String clusterName) { + base = "storage/cluster." + clusterName + "/distributor/"; + all = base + "*/default"; + + } /** * Find host pattern of the hosts that are valid targets for this request. * @param distributor Set to -1 if any distributor is valid target. */ public String getDistributorHostPattern(Integer distributor) { - return "storage/cluster." + clusterName + "/distributor/" + (distributor == null ? "*" : distributor) + "/default"; + return (distributor == null) ? all : (base + distributor + "/default"); } } /** Helper class to match a host pattern with node to use. */ public abstract static class HostFetcher { - private int requiredUpPercentageToSendToKnownGoodNodes = 60; - private List<Integer> validRandomTargets = new ArrayList<>(); - private int totalTargets = 1; + + private static class Targets { + private final List<Integer> list; + private final int total; + Targets() { + this(Collections.emptyList(), 1); + } + Targets(List<Integer> list, int total) { + this.list = list; + this.total = total; + } + } + + private final int requiredUpPercentageToSendToKnownGoodNodes; + private final AtomicReference<Targets> validTargets = new AtomicReference<>(new Targets()); protected final Random randomizer = new Random(12345); // Use same randomizer each time to make unit testing easy. - void setRequiredUpPercentageToSendToKnownGoodNodes(int percent) { this.requiredUpPercentageToSendToKnownGoodNodes = percent; } + protected HostFetcher(int percent) { + requiredUpPercentageToSendToKnownGoodNodes = percent; + } void updateValidTargets(ClusterState state) { List<Integer> validRandomTargets = new ArrayList<>(); for (int i=0; i<state.getNodeCount(NodeType.DISTRIBUTOR); ++i) { if (state.getNodeState(new Node(NodeType.DISTRIBUTOR, i)).getState().oneOf(upStates)) validRandomTargets.add(i); } - this.validRandomTargets = validRandomTargets; - this.totalTargets = state.getNodeCount(NodeType.DISTRIBUTOR); + validTargets.set(new Targets(new CopyOnWriteArrayList<>(validRandomTargets), state.getNodeCount(NodeType.DISTRIBUTOR))); } public abstract String getTargetSpec(Integer distributor, RoutingContext context); String getRandomTargetSpec(RoutingContext context) { + Targets targets = validTargets.get(); // Try to use list of random targets, if at least X % of the nodes are up - while (100 * validRandomTargets.size() / totalTargets >= requiredUpPercentageToSendToKnownGoodNodes) { - int randIndex = randomizer.nextInt(validRandomTargets.size()); - String targetSpec = getTargetSpec(validRandomTargets.get(randIndex), context); + while (100 * targets.list.size() / targets.total >= requiredUpPercentageToSendToKnownGoodNodes) { + int randIndex = randomizer.nextInt(targets.list.size()); + String targetSpec = getTargetSpec(targets.list.get(randIndex), context); if (targetSpec != null) { context.trace(3, "Sending to random node seen up in cluster state"); return targetSpec; } - validRandomTargets.remove(randIndex); + targets.list.remove(randIndex); } context.trace(3, "Too few nodes seen up in state. Sending totally random."); return getTargetSpec(null, context); @@ -100,9 +122,10 @@ public class StoragePolicy extends ExternalSlobrokPolicy { /** Host fetcher using a slobrok mirror to find the hosts. */ public static class SlobrokHostFetcher extends HostFetcher { private final SlobrokHostPatternGenerator patternGenerator; - ExternalSlobrokPolicy policy; + private final SlobrokPolicy policy; - SlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, ExternalSlobrokPolicy policy) { + SlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, SlobrokPolicy policy, int percent) { + super(percent); this.patternGenerator = patternGenerator; this.policy = policy; } @@ -115,6 +138,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy { public IMirror getMirror(RoutingContext context) { return context.getMirror(); } + @Override public String getTargetSpec(Integer distributor, RoutingContext context) { List<Mirror.Entry> arr = getEntries(patternGenerator.getDistributorHostPattern(distributor), context); if (arr.isEmpty()) return null; @@ -155,21 +179,21 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } } - private volatile GenerationCache generationCache = null; + private final AtomicReference<GenerationCache> generationCache = new AtomicReference<>(null); - TargetCachingSlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, ExternalSlobrokPolicy policy) { - super(patternGenerator, policy); + TargetCachingSlobrokHostFetcher(SlobrokHostPatternGenerator patternGenerator, SlobrokPolicy policy, int percent) { + super(patternGenerator, policy, percent); } @Override public String getTargetSpec(Integer distributor, RoutingContext context) { - GenerationCache cache = generationCache; + GenerationCache cache = generationCache.get(); int currentGeneration = getMirror(context).updates(); // The below code might race with other threads during a generation change. That is OK, as the cache // is thread safe and will quickly converge to a stable state for the new generation. if (cache == null || currentGeneration != cache.generation()) { cache = new GenerationCache(currentGeneration); - generationCache = cache; + generationCache.set(cache); } if (distributor != null) { return cachingGetTargetSpec(distributor, context, cache); @@ -206,7 +230,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy { if (clusterName == null) throw new IllegalArgumentException("Required parameter cluster with clustername not set"); } - public String getDistributionConfigId() { + String getDistributionConfigId() { return (distributionConfigId == null ? "storage/cluster." + clusterName : distributionConfigId); } public String getClusterName() { @@ -215,13 +239,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy { public SlobrokHostPatternGenerator createPatternGenerator() { return new SlobrokHostPatternGenerator(getClusterName()); } - public HostFetcher createHostFetcher(ExternalSlobrokPolicy policy) { - return new TargetCachingSlobrokHostFetcher(slobrokHostPatternGenerator, policy); + public HostFetcher createHostFetcher(SlobrokPolicy policy, int percent) { + return new TargetCachingSlobrokHostFetcher(slobrokHostPatternGenerator, policy, percent); } - public Distribution createDistribution(ExternalSlobrokPolicy policy) { - return (policy.configSources != null ? - new Distribution(getDistributionConfigId(), new ConfigSourceSet(policy.configSources)) - : new Distribution(getDistributionConfigId())); + public Distribution createDistribution(SlobrokPolicy policy) { + return new Distribution(getDistributionConfigId()); } /** @@ -278,8 +300,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy { public static class DistributorSelectionLogic { /** Class that tracks a failure of a given type per node. */ static class InstabilityChecker { - private List<Integer> nodeFailures = new ArrayList<>(); - private int failureLimit; + private final List<Integer> nodeFailures = new CopyOnWriteArrayList<>(); + private final int failureLimit; InstabilityChecker(int failureLimit) { this.failureLimit = failureLimit; } @@ -299,10 +321,19 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } /** Message context class. Contains data we want to inspect about a request at reply time. */ private static class MessageContext { - Integer calculatedDistributor; - ClusterState usedState; + final Integer calculatedDistributor; + final ClusterState usedState; - MessageContext(ClusterState usedState) { this.usedState = usedState; } + MessageContext() { + this(null, null); + } + MessageContext(ClusterState usedState) { + this(usedState, null); + } + MessageContext(ClusterState usedState, Integer calculatedDistributor) { + this.calculatedDistributor = calculatedDistributor; + this.usedState = usedState; + } public String toString() { return "Context(Distributor " + calculatedDistributor + @@ -313,13 +344,12 @@ public class StoragePolicy extends ExternalSlobrokPolicy { private final HostFetcher hostFetcher; private final Distribution distribution; private final InstabilityChecker persistentFailureChecker; - private ClusterState cachedClusterState = null; - private int oldClusterVersionGottenCount = 0; + private final AtomicReference<ClusterState> safeCachedClusterState = new AtomicReference<>(null); + private final AtomicInteger oldClusterVersionGottenCount = new AtomicInteger(0); private final int maxOldClusterVersionBeforeSendingRandom; // Reset cluster version protection - DistributorSelectionLogic(Parameters params, ExternalSlobrokPolicy policy) { - this.hostFetcher = params.createHostFetcher(policy); - this.hostFetcher.setRequiredUpPercentageToSendToKnownGoodNodes(params.getRequiredUpPercentageToSendToKnownGoodNodes()); + DistributorSelectionLogic(Parameters params, SlobrokPolicy policy) { + this.hostFetcher = params.createHostFetcher(policy, params.getRequiredUpPercentageToSendToKnownGoodNodes()); this.distribution = params.createDistribution(policy); persistentFailureChecker = new InstabilityChecker(params.getAttemptRandomOnFailuresLimit()); maxOldClusterVersionBeforeSendingRandom = params.maxOldClusterStatesSeenBeforeThrowingCachedState(); @@ -332,8 +362,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy { String getTargetSpec(RoutingContext context, BucketId bucketId) { String sendRandomReason = null; - MessageContext messageContext = new MessageContext(cachedClusterState); - context.setContext(messageContext); + ClusterState cachedClusterState = safeCachedClusterState.get(); + if (cachedClusterState != null) { // If we have a cached cluster state (regular case), we use that to calculate correct node. try{ Integer target = distribution.getIdealDistributorNode(cachedClusterState, bucketId, owningBucketStates); @@ -344,19 +374,20 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } // If we have found a target, and the target exists in slobrok, send to it. if (target != null) { - messageContext.calculatedDistributor = target; + context.setContext(new MessageContext(cachedClusterState, target)); String targetSpec = hostFetcher.getTargetSpec(target, context); if (targetSpec != null) { if (context.shouldTrace(1)) { - context.trace(1, "Using distributor " + messageContext.calculatedDistributor + " for " + + context.trace(1, "Using distributor " + target + " for " + bucketId + " as our state version is " + cachedClusterState.getVersion()); } - messageContext.usedState = cachedClusterState; return targetSpec; } else { - sendRandomReason = "Want to use distributor " + messageContext.calculatedDistributor + " but it is not in slobrok. Sending to random."; + sendRandomReason = "Want to use distributor " + target + " but it is not in slobrok. Sending to random."; log.log(LogLevel.DEBUG, "Target distributor is not in slobrok"); } + } else { + context.setContext(new MessageContext(cachedClusterState)); } } catch (Distribution.TooFewBucketBitsInUseException e) { Reply reply = new WrongDistributionReply(cachedClusterState.toString(true)); @@ -366,10 +397,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy { return null; } catch (Distribution.NoDistributorsAvailableException e) { log.log(LogLevel.DEBUG, "No distributors available; clearing cluster state"); - cachedClusterState = null; + safeCachedClusterState.set(null); sendRandomReason = "No distributors available. Sending to random distributor."; } } else { + context.setContext(new MessageContext(null)); sendRandomReason = "No cluster state cached. Sending to random distributor."; } if (context.shouldTrace(1)) { @@ -406,13 +438,14 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } private void updateCachedRoutingStateFromWrongDistribution(MessageContext context, ClusterState newState) { + ClusterState cachedClusterState = safeCachedClusterState.get(); if (cachedClusterState == null || newState.getVersion() >= cachedClusterState.getVersion()) { - cachedClusterState = newState; + safeCachedClusterState.set(newState); if (newState.getClusterState().equals(State.UP)) { hostFetcher.updateValidTargets(newState); } } else if (newState.getVersion() + 2000000000 < cachedClusterState.getVersion()) { - cachedClusterState = null; + safeCachedClusterState.set(null); } else if (context.calculatedDistributor != null) { persistentFailureChecker.addFailure(context.calculatedDistributor); } @@ -449,10 +482,11 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } private void resetCachedStateIfClusterStateVersionLikelyRolledBack(ClusterState newState) { + ClusterState cachedClusterState = safeCachedClusterState.get(); if (cachedClusterState != null && cachedClusterState.getVersion() > newState.getVersion()) { - if (++oldClusterVersionGottenCount >= maxOldClusterVersionBeforeSendingRandom) { - oldClusterVersionGottenCount = 0; - cachedClusterState = null; + if (oldClusterVersionGottenCount.incrementAndGet() >= maxOldClusterVersionBeforeSendingRandom) { + oldClusterVersionGottenCount.set(0); + safeCachedClusterState.set(null); } } } @@ -473,6 +507,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy { if (!reply.getTrace().shouldTrace(1)) { return; } + ClusterState cachedClusterState = safeCachedClusterState.get(); if (cachedClusterState == null) { reply.getTrace().trace(1, "Message sent to * with no previous state, received version " + newState.getVersion()); } else if (newState.getVersion() == cachedClusterState.getVersion()) { @@ -496,8 +531,8 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } private final BucketIdCalculator bucketIdCalculator = new BucketIdCalculator(); - private DistributorSelectionLogic distributorSelectionLogic = null; - private Parameters parameters; + private final DistributorSelectionLogic distributorSelectionLogic; + private final Parameters parameters; /** Constructor used in production. */ public StoragePolicy(String param) { @@ -505,23 +540,18 @@ public class StoragePolicy extends ExternalSlobrokPolicy { } public StoragePolicy(Map<String, String> params) { - this(new Parameters(params), params); + this(new Parameters(params)); } /** Constructor specifying a bit more in detail, so we can override what needs to be overridden in tests */ - public StoragePolicy(Parameters p, Map<String, String> params) { - super(params); + public StoragePolicy(Parameters p) { + super(); parameters = p; + distributorSelectionLogic = new DistributorSelectionLogic(parameters, this); } @Override - public void init() { - super.init(); - this.distributorSelectionLogic = new DistributorSelectionLogic(parameters, this); - } - - @Override - public void doSelect(RoutingContext context) { + public void select(RoutingContext context) { if (context.shouldTrace(1)) { context.trace(1, "Selecting route"); } diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java index 4413b657739..404a3660208 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/TargetCachingSlobrokHostFetcherTest.java @@ -47,10 +47,10 @@ public class TargetCachingSlobrokHostFetcherTest { } static class Fixture { - ExternalSlobrokPolicy mockSlobrokPolicy = mock(ExternalSlobrokPolicy.class); + SlobrokPolicy mockSlobrokPolicy = mock(SlobrokPolicy.class); IMirror mockMirror = mock(IMirror.class); StoragePolicy.SlobrokHostPatternGenerator patternGenerator = new StoragePolicy.SlobrokHostPatternGenerator("foo"); - StoragePolicy.TargetCachingSlobrokHostFetcher hostFetcher = new StoragePolicy.TargetCachingSlobrokHostFetcher(patternGenerator, mockSlobrokPolicy); + StoragePolicy.TargetCachingSlobrokHostFetcher hostFetcher = new StoragePolicy.TargetCachingSlobrokHostFetcher(patternGenerator, mockSlobrokPolicy, 60); RoutingContext routingContext = mock(RoutingContext.class); Fixture() { diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java index fd9d3f78ca8..fd5f43c23c1 100755 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/PolicyTestCase.java @@ -59,9 +59,11 @@ import java.util.TreeSet; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; /** * @author Simon Thoresen Hult @@ -101,7 +103,7 @@ public class PolicyTestCase { policy = new DocumentProtocol(manager).createPolicy("SubsetService", null); assertTrue(policy instanceof SubsetServicePolicy); - policy = new DocumentProtocol(manager).createPolicy("LoadBalancer", null); + policy = new DocumentProtocol(manager).createPolicy("LoadBalancer", "cluster=docproc/cluster.default;session=chain.default"); assertTrue(policy instanceof LoadBalancerPolicy); } diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java index b2a137abc7d..6a3e6a172c3 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/StoragePolicyTestEnvironment.java @@ -5,10 +5,9 @@ import com.yahoo.collections.Pair; import com.yahoo.document.DocumentId; import com.yahoo.document.DocumentTypeManager; import com.yahoo.document.DocumentTypeManagerConfigurer; -import com.yahoo.documentapi.messagebus.protocol.AsyncInitializationPolicy; import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy; -import com.yahoo.documentapi.messagebus.protocol.ExternalSlobrokPolicy; +import com.yahoo.documentapi.messagebus.protocol.SlobrokPolicy; import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage; import com.yahoo.documentapi.messagebus.protocol.RoutingPolicyFactory; import com.yahoo.documentapi.messagebus.protocol.StoragePolicy; @@ -110,6 +109,7 @@ public abstract class StoragePolicyTestEnvironment { private Integer avoidPickingAtRandom = null; public TestHostFetcher(String clusterName, Set<Integer> nodes) { + super(60); this.clusterName = clusterName; this.nodes = nodes; } @@ -148,16 +148,16 @@ public abstract class StoragePolicyTestEnvironment { private final Distribution distribution; public TestParameters(String parameters, Set<Integer> nodes) { - super(AsyncInitializationPolicy.parse(parameters)); + super(SlobrokPolicy.parse(parameters)); hostFetcher = new TestHostFetcher(getClusterName(), nodes); distribution = new Distribution(Distribution.getDefaultDistributionConfig(2, 10)); } @Override - public StoragePolicy.HostFetcher createHostFetcher(ExternalSlobrokPolicy policy) { return hostFetcher; } + public StoragePolicy.HostFetcher createHostFetcher(SlobrokPolicy policy, int percent) { return hostFetcher; } @Override - public Distribution createDistribution(ExternalSlobrokPolicy policy) { return distribution; } + public Distribution createDistribution(SlobrokPolicy policy) { return distribution; } } public static class StoragePolicyTestFactory implements RoutingPolicyFactory { @@ -170,13 +170,13 @@ public abstract class StoragePolicyTestEnvironment { } public DocumentProtocolRoutingPolicy createPolicy(String parameters) { parameterInstances.addLast(new TestParameters(parameters, nodes)); - ((TestHostFetcher) parameterInstances.getLast().createHostFetcher(null)).setAvoidPickingAtRandom(avoidPickingAtRandom); - return new StoragePolicy(parameterInstances.getLast(), AsyncInitializationPolicy.parse(parameters)); + ((TestHostFetcher) parameterInstances.getLast().createHostFetcher(null, 60)).setAvoidPickingAtRandom(avoidPickingAtRandom); + return new StoragePolicy(parameterInstances.getLast()); } public void avoidPickingAtRandom(Integer distributor) { avoidPickingAtRandom = distributor; for (TestParameters params : parameterInstances) { - ((TestHostFetcher) params.createHostFetcher(null)).setAvoidPickingAtRandom(avoidPickingAtRandom); + ((TestHostFetcher) params.createHostFetcher(null, 60)).setAvoidPickingAtRandom(avoidPickingAtRandom); } } public TestParameters getLastParameters() { return parameterInstances.getLast(); } diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp index f3a99f8a36c..47a37824c3a 100644 --- a/eval/src/apps/tensor_conformance/generate.cpp +++ b/eval/src/apps/tensor_conformance/generate.cpp @@ -104,10 +104,9 @@ void generate_join_expr(const vespalib::string &expr, const Sequence &seq, TestB std::vector<Layout> layouts = { {}, {}, {x(5)}, {x(5)}, - {x(5)}, {x(3)}, {x(5)}, {y(5)}, {x(5)}, {x(5),y(5)}, - {x(3),y(5)}, {x(4),y(4)}, + {x(5),y(3)}, {x(5),y(3)}, {x(3),y(5)}, {y(5),z(7)}, {x({"a","b","c"})}, {x({"a","b","c"})}, {x({"a","b","c"})}, {x({"a","b"})}, @@ -161,10 +160,6 @@ void generate_tensor_join(TestBuilder &dst) { void generate_dot_product(TestBuilder &dst) { dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}}, spec((2 * 7) + (3 * 11) + (5 * 13))); - dst.add("reduce(a*b,sum)", {{"a", spec(x(2), Seq({ 2, 3 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}}, - spec((2 * 7) + (3 * 11))); - dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(2), Seq({ 7, 11 }))}}, - spec((2 * 7) + (3 * 11))); } //----------------------------------------------------------------------------- @@ -191,7 +186,7 @@ void generate_tensor_concat(TestBuilder &dst) { spec({x(4),y(2)}, Seq({1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 6.0}))); dst.add("concat(a,b,x)", {{"a", spec(z(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}}, spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0}))); - dst.add("concat(a,b,x)", {{"a", spec(y(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}}, + dst.add("concat(a,b,x)", {{"a", spec(y(2), Seq({1.0, 2.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}}, spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0}))); dst.add("concat(concat(a,b,x),concat(c,d,x),y)", {{"a", spec(1.0)}, {"b", spec(2.0)}, {"c", spec(3.0)}, {"d", spec(4.0)}}, spec({x(2), y(2)}, Seq({1.0, 3.0, 2.0, 4.0}))); diff --git a/eval/src/apps/tensor_conformance/test_spec.json b/eval/src/apps/tensor_conformance/test_spec.json index 335c4bcb939..b5374e6033d 100644 --- a/eval/src/apps/tensor_conformance/test_spec.json +++ b/eval/src/apps/tensor_conformance/test_spec.json @@ -579,10 +579,9 @@ {"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169400199999999999A4008000000000000400E6666666666664012666666666666401599999999999A0161016A4003333333333333400999999999999A4010000000000000401333333333333340166666666666660161016B4004CCCCCCCCCCCD400B3333333333334010CCCCCCCCCCCD401400000000000040173333333333330161016C4006666666666666400CCCCCCCCCCCCD401199999999999A4014CCCCCCCCCCCD4018000000000000016201694018CCCCCCCCCCCD401C000000000000401F33333333333340213333333333334022CCCCCCCCCCCD0162016A401999999999999A401CCCCCCCCCCCCD4020000000000000402199999999999A40233333333333330162016B401A666666666666401D99999999999A40206666666666664022000000000000402399999999999A0162016C401B333333333333401E6666666666664020CCCCCCCCCCCD402266666666666640240000000000000163016940246666666666664026000000000000402799999999999A4029333333333333402ACCCCCCCCCCCD0163016A4024CCCCCCCCCCCD40266666666666664028000000000000402999999999999A402B3333333333330163016B40253333333333334026CCCCCCCCCCCD4028666666666666402A000000000000402B99999999999A0163016C402599999999999A40273333333333334028CCCCCCCCCCCD402A666666666666402C000000000000"}} {"expression":"a+b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}} {"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}} -{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}} {"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}} {"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}} -{"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}} +{"expression":"a+b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF00000000000003FF33333333333333FF66666666666663FF999999999999A3FFCCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}} {"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}} {"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}} {"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}} @@ -594,10 +593,9 @@ {"expression":"a+b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}} -{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}} +{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF00000000000003FF33333333333333FF66666666666663FF999999999999A3FFCCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}} {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}} @@ -609,10 +607,9 @@ {"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}} {"expression":"a-b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}} {"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}} -{"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"a-b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}} {"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -624,10 +621,9 @@ {"expression":"a-b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}} -{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -639,10 +635,9 @@ {"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}} {"expression":"a*b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}} {"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}} -{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}} {"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}} {"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}} -{"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}} +{"expression":"a*b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD00000000000003FD70A3D70A3D70A3FDF5C28F5C28F5B3FE47AE147AE147C3FE9EB851EB851EC3FF00000000000003FF35C28F5C28F5D3FF70A3D70A3D70A3FFB0A3D70A3D70B3FFF5C28F5C28F5B4002000000000000"}} {"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}} {"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}} {"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}} @@ -654,10 +649,9 @@ {"expression":"a*b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}} -{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}} -{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}} +{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD00000000000003FD70A3D70A3D70A3FDF5C28F5C28F5B3FE47AE147AE147C3FE9EB851EB851EC3FF00000000000003FF35C28F5C28F5D3FF70A3D70A3D70A3FFB0A3D70A3D70B3FFF5C28F5C28F5B4002000000000000"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}} {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}} @@ -669,10 +663,9 @@ {"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}} {"expression":"a/b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}} {"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}} -{"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}} +{"expression":"a/b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}} {"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -684,10 +677,9 @@ {"expression":"a/b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}} -{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}} +{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -699,10 +691,9 @@ {"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}} {"expression":"a%b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}} {"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"a%b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -714,10 +705,9 @@ {"expression":"a%b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -729,10 +719,9 @@ {"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}} {"expression":"a^b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}} {"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}} -{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}} {"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}} {"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}} -{"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}} +{"expression":"a^b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}} {"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}} {"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}} {"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}} @@ -744,10 +733,9 @@ {"expression":"a^b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}} -{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}} -{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}} +{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}} {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}} @@ -759,10 +747,9 @@ {"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}} {"expression":"pow(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}} {"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}} -{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}} {"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}} {"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}} -{"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}} +{"expression":"pow(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}} {"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}} {"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}} {"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}} @@ -774,10 +761,9 @@ {"expression":"pow(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}} -{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}} -{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}} +{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD3FE78D7DD8F4883C3FE8EE06AA5599B03FEAC4B4102DA8F13FED1AE40F9D88D83FF00000000000003FF1C4BF8D66AE6C3FF3E9BCB96FEDF13FF680D8B66CC34C3FF9A088BB80392C3FFD64D51E0DB1C6"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}} {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}} @@ -789,10 +775,9 @@ {"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}} {"expression":"a==b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"a==b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -804,10 +789,9 @@ {"expression":"a==b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -819,10 +803,9 @@ {"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"a!=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -834,10 +817,9 @@ {"expression":"a!=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -849,10 +831,9 @@ {"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"a~=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -864,10 +845,9 @@ {"expression":"a~=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -879,10 +859,9 @@ {"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a<b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"a<b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -894,10 +873,9 @@ {"expression":"a<b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -909,10 +887,9 @@ {"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"a<=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -924,10 +901,9 @@ {"expression":"a<=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} +{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -939,10 +915,9 @@ {"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"a>b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}} {"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"a>b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -954,10 +929,9 @@ {"expression":"a>b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -969,10 +943,9 @@ {"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}} {"expression":"a>=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"a>=b","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -984,10 +957,9 @@ {"expression":"a>=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}} @@ -999,10 +971,9 @@ {"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}} {"expression":"a&&b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} -{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}} {"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} {"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}} -{"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}} +{"expression":"a&&b","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} {"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}} @@ -1014,10 +985,9 @@ {"expression":"a&&b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}} +{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}} @@ -1029,10 +999,9 @@ {"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}} {"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} -{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"a||b","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}} @@ -1044,10 +1013,9 @@ {"expression":"a||b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} -{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} +{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020201780501790300000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}} {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}} @@ -1059,10 +1027,9 @@ {"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}} {"expression":"atan2(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}} {"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} -{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} {"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}} {"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}} -{"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}} +{"expression":"atan2(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} {"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}} {"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}} {"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}} @@ -1074,10 +1041,9 @@ {"expression":"atan2(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} -{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}} -{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}} +{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}} {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}} @@ -1089,10 +1055,9 @@ {"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}} -{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}} +{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1104,10 +1069,9 @@ {"expression":"ldexp(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}} -{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}} +{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD4000000000000000400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1119,10 +1083,9 @@ {"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"fmod(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -1134,10 +1097,9 @@ {"expression":"fmod(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}} +{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017805017903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}} {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}} @@ -1149,10 +1111,9 @@ {"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}} {"expression":"min(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} {"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}} +{"expression":"min(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}} {"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1164,10 +1125,9 @@ {"expression":"min(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}} +{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1179,10 +1139,9 @@ {"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}} {"expression":"max(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} {"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}} -{"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}} +{"expression":"max(a,b)","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}} {"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}} {"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1194,10 +1153,9 @@ {"expression":"max(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}} -{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}} -{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}} +{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}} {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}} @@ -1209,10 +1167,9 @@ {"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02004033FFFFFFFFFFFF"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178054033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF4010000000000000"}} -{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178034033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF402E0000000000004023FFFFFFFFFFFF4020AAAAAAAAAAAB401E000000000000401BFFFFFFFFFFFF402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB401755555555555540155555555555564028FFFFFFFFFFFF401E00000000000040175555555555554013FFFFFFFFFFFF40120000000000004027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF401AAAAAAAAAAAAB4019B6DB6DB6DB6E4018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4010F83E0F83E0F84010AAAAAAAAAAAB4010690690690691401030C30C30C30C40100000000000014008FFFFFFFFFFFF4008B4B4B4B4B4B5400871C71C71C71C400835E50D79435E4007FFFFFFFFFFFF4003CF3CF3CF3CF44003A2E8BA2E8BA340037A6F4DE9BD3840035555555555554003333333333333"}} -{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179044033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF400D5555555555564008C30C30C30C3040056DB6DB6DB6DC4002E38E38E38E394000295FAD40A57E3FFD5555555555563FFADA67D508F3783FF8C30C30C30C30"}} +{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178050179033FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178050179034033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF4010000000000000400AAAAAAAAAAAAB4006DB6DB6DB6DB74003FFFFFFFFFFFF4001C71C71C71C7240000000000000003FFD1745D1745D173FFAAAAAAAAAAAAB3FF89D89D89D89D83FF6DB6DB6DB6DB73FF5555555555555"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A074033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB74018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB74010000000000001400FAAAAAAAAAAAC400F5F5F5F5F5F5F400F1C71C71C71C7400EE08FB823EE09400EAAAAAAAAAAAA400E79E79E79E79E4007A2E8BA2E8BA240077A6F4DE9BD3840075555555555554007333333333333400713B13B13B13B4006F684BDA12F684006DB6DB6DB6DB74002C234F72C234F4002AAAAAAAAAAAB400294A5294A5295400280000000000040026C9B26C9B26D40025A5A5A5A5A5A40024924924924924027555555555555401AAAAAAAAAAAAB40140000000000004010AAAAAAAAAAAB400D555555555556400AAAAAAAAAAAAB4008C30C30C30C3040056DB6DB6DB6DC400451451451451540036DB6DB6DB6DC4002B3884FCACE214002186186186186400195195195195240012492492492493FFEAAAAAAAAAAA93FFE0000000000003FFD6969696969693FFCE38E38E38E383FFC6BCA1AF286BD3FFBFFFFFFFFFFFF3FFB9E79E79E79E83FF90CEDE62433B73FF8BBFB0D9A96E13FF871C71C71C71C3FF82D82D82D82D83FF7EE7EE7EE7EE73FF7B425ED097B423FF77DF7DF7DF7DF3FF58469EE58469F3FF55555555555553FF5294A5294A5293FF50000000000003FF4D9364D9364D93FF4B4B4B4B4B4B53FF49249249249254025D1745D1745D24017A2E8BA2E8BA24010F83E0F83E0F8400B45D1745D1745400745D1745D174640049B26C9B26C9B4002B3884FCACE214000AAAAAAAAAAAB3FFF1C71C71C71C73FFD5555555555563FFBE0F83E0F83E03FFAAAAAAAAAAAAB3FF9A41A41A41A413FF8C30C30C30C303FF6F96F96F96F963FF64EC4EC4EC4ED3FF5B82E55B82E563FF53253253253253FF4BA8F07414BAA3FF44EC4EC4EC4EC3FF3ED3ED3ED3ED43FF2B3884FCACE213FF262957741314B3FF21861861861863FF1D41D41D41D423FF19519519519523FF15AC056B015AC3FF12492492492493FF02F149902F14A3FF00000000000003FEFA7E9FA7E9FA73FEF5555555555543FEF07C1F07C1F093FEEBEBEBEBEBEC03FEE79E79E79E79E"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301614033FFFFFFFFFFFF01624023FFFFFFFFFFFF0163401AAAAAAAAAAAAB"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201614033FFFFFFFFFFFF01624023FFFFFFFFFFFF"}} @@ -1223,8 +1180,6 @@ {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261724018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB7400E000000000000400CE38E38E38E38400BFFFFFFFFFFFF400B45D1745D1745400AAAAAAAAAAAAB400A2762762762774009B6DB6DB6DB6E4007555555555555400638E38E38E38E400555555555555640049B26C9B26C9B400400000000000040037CB7CB7CB7CB40030C30C30C30C303666F6F4033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB7402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB40175555555555554015555555555556401400000000000040130C30C30C30C34027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000400D555555555556400B6DB6DB6DB6DC"}} {"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101694033FFFFFFFFFFFF401BFFFFFFFFFFFF4011C71C71C71C71400A2762762762774004B4B4B4B4B4B50161016A402E000000000000401AAAAAAAAAAAAB40115555555555564009B6DB6DB6DB6E400471C71C71C71C0161016B402AAAAAAAAAAAAB4019B6DB6DB6DB6E4010F83E0F83E0F84009555555555554400435E50D79435E0161016C4028FFFFFFFFFFFF4018FFFFFFFFFFFF4010AAAAAAAAAAAB4008FFFFFFFFFFFF4004000000000000016201694027555555555555400B6DB6DB6DB6DC4002E38E38E38E393FFE15E15E15E15E3FF969696969696A0162016A401AAAAAAAAAAAAB4008C30C30C30C3040020000000000003FFD34D34D34D34D3FF8E38E38E38E380162016B40140000000000004006DB6DB6DB6DB7400145D1745D17463FFC71C71C71C71C3FF86BCA1AF286BD0162016C4010AAAAAAAAAAAB40056DB6DB6DB6DC4000AAAAAAAAAAAB3FFBC71C71C71C713FF8000000000000016301694025D1745D1745D24006AAAAAAAAAAAB3FFE15E15E15E15E3FF7BC7BC7BC7BC93FF41414141414150163016A4017A2E8BA2E8BA240040000000000003FFC4EC4EC4EC4EB3FF6DB6DB6DB6DB73FF38E38E38E38E30163016B4010F83E0F83E0F840021861861861863FFADA67D508F3783FF61861861861873FF31674C59D31680163016C400B45D1745D17454000AAAAAAAAAAAB3FF9A41A41A41A413FF56DB6DB6DB6DC3FF2AAAAAAAAAAAB"}} {"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x0200405C000000000000"}} -{"expression":"reduce(a*b,sum)","inputs":{"a":"0x020101780240000000000000004008000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x02004047800000000000"}} -{"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017802401C0000000000004026000000000000"},"result":{"expect":"0x02004047800000000000"}} {"expression":"reduce(a*b,sum,x)","inputs":{"a":"0x02010178023FF00000000000004000000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x02010179034039000000000000403F0000000000004044800000000000"}} {"expression":"reduce(a*b,sum,y)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x020101780240410000000000004056000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}} @@ -1234,7 +1189,7 @@ {"expression":"concat(a,b,y)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101790240140000000000004018000000000000"},"result":{"expect":"0x02020178020179043FF00000000000004000000000000000401400000000000040180000000000004008000000000000401000000000000040140000000000004018000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101780240140000000000004018000000000000"},"result":{"expect":"0x02020178040179023FF00000000000004000000000000000400800000000000040100000000000004014000000000000401400000000000040180000000000004018000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x0201017A033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x0203017802017902017A033FF0000000000000400000000000000040080000000000003FF000000000000040000000000000004008000000000000401000000000000040100000000000004010000000000000401400000000000040140000000000004014000000000000"}} -{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}} +{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179023FF00000000000004000000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}} {"expression":"concat(concat(a,b,x),concat(c,d,x),y)","inputs":{"a":"0x02003FF0000000000000","b":"0x02004000000000000000","c":"0x02004008000000000000","d":"0x02004010000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400800000000000040000000000000004010000000000000"}} {"expression":"rename(a,x,y)","inputs":{"a":"0x02010178053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"},"result":{"expect":"0x02010179053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}} {"expression":"rename(a,y,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017805017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"}} @@ -1245,4 +1200,4 @@ {"expression":"tensor(x[10])(x+1)","inputs":{},"result":{"expect":"0x020101780A3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402000000000000040220000000000004024000000000000"}} {"expression":"tensor(x[5],y[4])(x*4+(y+1))","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000"}} {"expression":"tensor(x[5],y[4])(x==y)","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"num_tests":1247} +{"num_tests":1202} diff --git a/eval/src/tests/eval/node_types/node_types_test.cpp b/eval/src/tests/eval/node_types/node_types_test.cpp index ce01d3f78c0..c18470887b2 100644 --- a/eval/src/tests/eval/node_types/node_types_test.cpp +++ b/eval/src/tests/eval/node_types/node_types_test.cpp @@ -74,47 +74,31 @@ TEST("require that leaf constants have appropriate type") { } TEST("require that input parameters preserve their type") { - TEST_DO(verify("any", "any")); TEST_DO(verify("error", "error")); TEST_DO(verify("double", "double")); - TEST_DO(verify("tensor", "tensor")); - TEST_DO(verify("tensor(x{},y[10],z[])", "tensor(x{},y[10],z[])")); + TEST_DO(verify("tensor", "double")); + TEST_DO(verify("tensor(x{},y[10],z[5])", "tensor(x{},y[10],z[5])")); } TEST("require that if resolves to the appropriate type") { TEST_DO(verify("if(error,1,2)", "error")); TEST_DO(verify("if(1,error,2)", "error")); TEST_DO(verify("if(1,2,error)", "error")); - TEST_DO(verify("if(any,1,2)", "double")); TEST_DO(verify("if(double,1,2)", "double")); - TEST_DO(verify("if(tensor,1,2)", "double")); - TEST_DO(verify("if(double,tensor,tensor)", "tensor")); - TEST_DO(verify("if(double,any,any)", "any")); - TEST_DO(verify("if(double,tensor(a[2]),tensor(a[2]))", "tensor(a[2])")); - TEST_DO(verify("if(double,tensor(a[2]),tensor(a[3]))", "tensor(a[])")); - TEST_DO(verify("if(double,tensor(a[2]),tensor(a[]))", "tensor(a[])")); - TEST_DO(verify("if(double,tensor(a[2]),tensor(a{}))", "tensor")); + TEST_DO(verify("if(tensor(x[10]),1,2)", "double")); TEST_DO(verify("if(double,tensor(a{}),tensor(a{}))", "tensor(a{})")); - TEST_DO(verify("if(double,tensor(a{}),tensor(b{}))", "tensor")); - TEST_DO(verify("if(double,tensor(a{}),tensor)", "tensor")); - TEST_DO(verify("if(double,tensor,tensor(a{}))", "tensor")); - TEST_DO(verify("if(double,tensor,any)", "any")); - TEST_DO(verify("if(double,any,tensor)", "any")); - TEST_DO(verify("if(double,tensor,double)", "any")); - TEST_DO(verify("if(double,double,tensor)", "any")); - TEST_DO(verify("if(double,double,any)", "any")); - TEST_DO(verify("if(double,any,double)", "any")); + TEST_DO(verify("if(double,tensor(a[2]),tensor(a[2]))", "tensor(a[2])")); + TEST_DO(verify("if(double,tensor(a[2]),tensor(a[3]))", "error")); + TEST_DO(verify("if(double,tensor(a[2]),tensor(a{}))", "error")); + TEST_DO(verify("if(double,tensor(a{}),tensor(b{}))", "error")); + TEST_DO(verify("if(double,tensor(a{}),double)", "error")); } TEST("require that reduce resolves correct type") { TEST_DO(verify("reduce(error,sum)", "error")); - TEST_DO(verify("reduce(tensor,sum)", "double")); TEST_DO(verify("reduce(tensor(x{}),sum)", "double")); TEST_DO(verify("reduce(double,sum)", "double")); - TEST_DO(verify("reduce(any,sum)", "any")); TEST_DO(verify("reduce(error,sum,x)", "error")); - TEST_DO(verify("reduce(tensor,sum,x)", "any")); - TEST_DO(verify("reduce(any,sum,x)", "any")); TEST_DO(verify("reduce(double,sum,x)", "error")); TEST_DO(verify("reduce(tensor(x{},y{},z{}),sum,y)", "tensor(x{},z{})")); TEST_DO(verify("reduce(tensor(x{},y{},z{}),sum,x,z)", "tensor(y{})")); @@ -125,18 +109,16 @@ TEST("require that reduce resolves correct type") { TEST("require that rename resolves correct type") { TEST_DO(verify("rename(error,x,y)", "error")); - TEST_DO(verify("rename(tensor,x,y)", "any")); TEST_DO(verify("rename(double,x,y)", "error")); - TEST_DO(verify("rename(any,x,y)", "any")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),a,b)", "error")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,y)", "error")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,x)", "tensor(x{},y[],z[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),x,w)", "tensor(w{},y[],z[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),y,w)", "tensor(x{},w[],z[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),z,w)", "tensor(x{},y[],w[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,y,z),(z,y,x))", "tensor(z{},y[],x[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,z),(z,x))", "tensor(z{},y[],x[5])")); - TEST_DO(verify("rename(tensor(x{},y[],z[5]),(x,y,z),(a,b,c))", "tensor(a{},b[],c[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),a,b)", "error")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,y)", "error")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,x)", "tensor(x{},y[1],z[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),x,w)", "tensor(w{},y[1],z[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),y,w)", "tensor(x{},w[1],z[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),z,w)", "tensor(x{},y[1],w[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,y,z),(z,y,x))", "tensor(z{},y[1],x[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,z),(z,x))", "tensor(z{},y[1],x[5])")); + TEST_DO(verify("rename(tensor(x{},y[1],z[5]),(x,y,z),(a,b,c))", "tensor(a{},b[1],c[5])")); } vespalib::string strfmt(const char *pattern, const char *a) { @@ -149,37 +131,24 @@ vespalib::string strfmt(const char *pattern, const char *a, const char *b) { void verify_op1(const char *pattern) { TEST_DO(verify(strfmt(pattern, "error"), "error")); - TEST_DO(verify(strfmt(pattern, "any"), "any")); TEST_DO(verify(strfmt(pattern, "double"), "double")); - TEST_DO(verify(strfmt(pattern, "tensor"), "tensor")); - TEST_DO(verify(strfmt(pattern, "tensor(x{},y[10],z[])"), "tensor(x{},y[10],z[])")); + TEST_DO(verify(strfmt(pattern, "tensor(x{},y[10],z[1])"), "tensor(x{},y[10],z[1])")); } void verify_op2(const char *pattern) { TEST_DO(verify(strfmt(pattern, "error", "error"), "error")); - TEST_DO(verify(strfmt(pattern, "any", "error"), "error")); - TEST_DO(verify(strfmt(pattern, "error", "any"), "error")); TEST_DO(verify(strfmt(pattern, "double", "error"), "error")); TEST_DO(verify(strfmt(pattern, "error", "double"), "error")); - TEST_DO(verify(strfmt(pattern, "tensor", "error"), "error")); - TEST_DO(verify(strfmt(pattern, "error", "tensor"), "error")); - TEST_DO(verify(strfmt(pattern, "any", "any"), "any")); - TEST_DO(verify(strfmt(pattern, "any", "double"), "any")); - TEST_DO(verify(strfmt(pattern, "double", "any"), "any")); - TEST_DO(verify(strfmt(pattern, "any", "tensor"), "any")); - TEST_DO(verify(strfmt(pattern, "tensor", "any"), "any")); + TEST_DO(verify(strfmt(pattern, "tensor(x{})", "error"), "error")); + TEST_DO(verify(strfmt(pattern, "error", "tensor(x{})"), "error")); TEST_DO(verify(strfmt(pattern, "double", "double"), "double")); - TEST_DO(verify(strfmt(pattern, "tensor", "double"), "tensor")); - TEST_DO(verify(strfmt(pattern, "double", "tensor"), "tensor")); TEST_DO(verify(strfmt(pattern, "tensor(x{})", "double"), "tensor(x{})")); TEST_DO(verify(strfmt(pattern, "double", "tensor(x{})"), "tensor(x{})")); - TEST_DO(verify(strfmt(pattern, "tensor", "tensor"), "any")); TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x{})"), "tensor(x{})")); TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(y{})"), "tensor(x{},y{})")); - TEST_DO(verify(strfmt(pattern, "tensor(x[3])", "tensor(x[5])"), "tensor(x[3])")); - TEST_DO(verify(strfmt(pattern, "tensor(x[])", "tensor(x[5])"), "tensor(x[])")); - TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[3])"), "tensor(x[3])")); - TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[])"), "tensor(x[])")); + TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[5])"), "tensor(x[5])")); + TEST_DO(verify(strfmt(pattern, "tensor(x[3])", "tensor(x[5])"), "error")); + TEST_DO(verify(strfmt(pattern, "tensor(x[5])", "tensor(x[3])"), "error")); TEST_DO(verify(strfmt(pattern, "tensor(x{})", "tensor(x[5])"), "error")); } @@ -249,7 +218,8 @@ TEST("require that lambda tensor resolves correct type") { TEST("require that tensor concat resolves correct type") { TEST_DO(verify("concat(double,double,x)", "tensor(x[2])")); TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),x)", "tensor(x[5])")); - TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),y)", "tensor(x[2],y[2])")); + TEST_DO(verify("concat(tensor(x[2]),tensor(x[2]),y)", "tensor(x[2],y[2])")); + TEST_DO(verify("concat(tensor(x[2]),tensor(x[3]),y)", "error")); TEST_DO(verify("concat(tensor(x[2]),tensor(x{}),x)", "error")); TEST_DO(verify("concat(tensor(x[2]),tensor(y{}),x)", "tensor(x[3],y{})")); } @@ -258,7 +228,7 @@ TEST("require that double only expressions can be detected") { Function plain_fun = Function::parse("1+2"); Function complex_fun = Function::parse("reduce(a,sum)"); NodeTypes plain_types(plain_fun, {}); - NodeTypes complex_types(complex_fun, {ValueType::tensor_type({})}); + NodeTypes complex_types(complex_fun, {ValueType::tensor_type({{"x"}})}); EXPECT_TRUE(plain_types.get_type(plain_fun.root()).is_double()); EXPECT_TRUE(complex_types.get_type(complex_fun.root()).is_double()); EXPECT_TRUE(plain_types.all_types_are_double()); @@ -269,7 +239,7 @@ TEST("require that empty type repo works as expected") { NodeTypes types; Function function = Function::parse("1+2"); EXPECT_FALSE(function.has_error()); - EXPECT_TRUE(types.get_type(function.root()).is_any()); + EXPECT_TRUE(types.get_type(function.root()).is_error()); EXPECT_FALSE(types.all_types_are_double()); } diff --git a/eval/src/tests/eval/tensor_function/tensor_function_test.cpp b/eval/src/tests/eval/tensor_function/tensor_function_test.cpp index 23ea1e8c13a..741b756e46f 100644 --- a/eval/src/tests/eval/tensor_function/tensor_function_test.cpp +++ b/eval/src/tests/eval/tensor_function/tensor_function_test.cpp @@ -261,11 +261,16 @@ TEST("require that if_node result is mutable only when both children produce mut const Node &cond = inject(DoubleValue::double_type(), 0, stash); const Node &a = inject(ValueType::from_spec("tensor(x[2])"), 0, stash); const Node &b = inject(ValueType::from_spec("tensor(x[3])"), 0, stash); + const Node &c = inject(ValueType::from_spec("tensor(x[5])"), 0, stash); const Node &tmp = concat(a, b, "x", stash); // will be mutable - const Node &if_con_con = if_node(cond, a, b, stash); - const Node &if_mut_con = if_node(cond, tmp, b, stash); - const Node &if_con_mut = if_node(cond, a, tmp, stash); + const Node &if_con_con = if_node(cond, c, c, stash); + const Node &if_mut_con = if_node(cond, tmp, c, stash); + const Node &if_con_mut = if_node(cond, c, tmp, stash); const Node &if_mut_mut = if_node(cond, tmp, tmp, stash); + EXPECT_EQUAL(if_con_con.result_type(), c.result_type()); + EXPECT_EQUAL(if_con_mut.result_type(), c.result_type()); + EXPECT_EQUAL(if_mut_con.result_type(), c.result_type()); + EXPECT_EQUAL(if_mut_mut.result_type(), c.result_type()); EXPECT_TRUE(!if_con_con.result_is_mutable()); EXPECT_TRUE(!if_mut_con.result_is_mutable()); EXPECT_TRUE(!if_con_mut.result_is_mutable()); @@ -277,21 +282,12 @@ TEST("require that if_node gets expected result type") { const Node &a = inject(DoubleValue::double_type(), 0, stash); const Node &b = inject(ValueType::from_spec("tensor(x[2])"), 0, stash); const Node &c = inject(ValueType::from_spec("tensor(x[3])"), 0, stash); - const Node &d = inject(ValueType::from_spec("tensor(x[])"), 0, stash); - const Node &e = inject(ValueType::from_spec("tensor(y[3])"), 0, stash); - const Node &f = inject(ValueType::from_spec("double"), 0, stash); - const Node &g = inject(ValueType::from_spec("error"), 0, stash); + const Node &d = inject(ValueType::from_spec("error"), 0, stash); const Node &if_same = if_node(a, b, b, stash); - const Node &if_similar = if_node(a, b, c, stash); - const Node &if_subtype = if_node(a, b, d, stash); - const Node &if_different = if_node(a, b, e, stash); - const Node &if_different_types = if_node(a, b, f, stash); - const Node &if_with_error = if_node(a, b, g, stash); + const Node &if_different = if_node(a, b, c, stash); + const Node &if_with_error = if_node(a, b, d, stash); EXPECT_EQUAL(if_same.result_type(), ValueType::from_spec("tensor(x[2])")); - EXPECT_EQUAL(if_similar.result_type(), ValueType::from_spec("tensor(x[])")); - EXPECT_EQUAL(if_subtype.result_type(), ValueType::from_spec("tensor(x[])")); - EXPECT_EQUAL(if_different.result_type(), ValueType::from_spec("tensor")); - EXPECT_EQUAL(if_different_types.result_type(), ValueType::from_spec("any")); + EXPECT_EQUAL(if_different.result_type(), ValueType::from_spec("error")); EXPECT_EQUAL(if_with_error.result_type(), ValueType::from_spec("error")); } diff --git a/eval/src/tests/eval/value_type/value_type_test.cpp b/eval/src/tests/eval/value_type/value_type_test.cpp index f7db7816fad..a755eac965f 100644 --- a/eval/src/tests/eval/value_type/value_type_test.cpp +++ b/eval/src/tests/eval/value_type/value_type_test.cpp @@ -10,12 +10,6 @@ using namespace vespalib::eval; const size_t npos = ValueType::Dimension::npos; -TEST("require that ANY value type can be created") { - ValueType t = ValueType::any_type(); - EXPECT_TRUE(t.type() == ValueType::Type::ANY); - EXPECT_EQUAL(t.dimensions().size(), 0u); -} - TEST("require that ERROR value type can be created") { ValueType t = ValueType::error_type(); EXPECT_TRUE(t.type() == ValueType::Type::ERROR); @@ -61,10 +55,9 @@ TEST("require that dimension names can be obtained") { TEST("require that dimension index can be obtained") { EXPECT_EQUAL(ValueType::error_type().dimension_index("x"), ValueType::Dimension::npos); - EXPECT_EQUAL(ValueType::any_type().dimension_index("x"), ValueType::Dimension::npos); EXPECT_EQUAL(ValueType::double_type().dimension_index("x"), ValueType::Dimension::npos); EXPECT_EQUAL(ValueType::tensor_type({}).dimension_index("x"), ValueType::Dimension::npos); - auto my_type = ValueType::tensor_type({{"y", 10}, {"x"}, {"z", 0}}); + auto my_type = ValueType::tensor_type({{"y", 10}, {"x"}, {"z", 5}}); EXPECT_EQUAL(my_type.dimension_index("x"), 0u); EXPECT_EQUAL(my_type.dimension_index("y"), 1u); EXPECT_EQUAL(my_type.dimension_index("z"), 2u); @@ -72,29 +65,30 @@ TEST("require that dimension index can be obtained") { } void verify_equal(const ValueType &a, const ValueType &b) { - EXPECT_TRUE(a == b); - EXPECT_TRUE(b == a); + EXPECT_EQUAL(a, b); + EXPECT_EQUAL(b, a); EXPECT_FALSE(a != b); EXPECT_FALSE(b != a); + EXPECT_EQUAL(a, ValueType::either(a, b)); + EXPECT_EQUAL(a, ValueType::either(b, a)); } - + void verify_not_equal(const ValueType &a, const ValueType &b) { EXPECT_TRUE(a != b); EXPECT_TRUE(b != a); EXPECT_FALSE(a == b); EXPECT_FALSE(b == a); + EXPECT_TRUE(ValueType::either(a, b).is_error()); + EXPECT_TRUE(ValueType::either(b, a).is_error()); } TEST("require that value types can be compared") { TEST_DO(verify_equal(ValueType::error_type(), ValueType::error_type())); - TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::any_type())); TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::double_type())); - TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::tensor_type({}))); - TEST_DO(verify_equal(ValueType::any_type(), ValueType::any_type())); - TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::double_type())); - TEST_DO(verify_not_equal(ValueType::any_type(), ValueType::tensor_type({}))); + TEST_DO(verify_not_equal(ValueType::error_type(), ValueType::tensor_type({{"x"}}))); TEST_DO(verify_equal(ValueType::double_type(), ValueType::double_type())); - TEST_DO(verify_not_equal(ValueType::double_type(), ValueType::tensor_type({}))); + TEST_DO(verify_equal(ValueType::double_type(), ValueType::tensor_type({}))); + TEST_DO(verify_not_equal(ValueType::double_type(), ValueType::tensor_type({{"x"}}))); TEST_DO(verify_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"y"}, {"x"}}))); TEST_DO(verify_not_equal(ValueType::tensor_type({{"x"}, {"y"}}), ValueType::tensor_type({{"x"}, {"y"}, {"z"}}))); TEST_DO(verify_equal(ValueType::tensor_type({{"x", 10}, {"y", 20}}), ValueType::tensor_type({{"y", 20}, {"x", 10}}))); @@ -103,67 +97,55 @@ TEST("require that value types can be compared") { } void verify_predicates(const ValueType &type, - bool expect_any, bool expect_error, bool expect_double, bool expect_tensor, - bool expect_maybe_tensor, bool expect_abstract, bool expect_unknown_dimensions) + bool expect_error, bool expect_double, bool expect_tensor, + bool expect_sparse, bool expect_dense) { - EXPECT_EQUAL(type.is_any(), expect_any); EXPECT_EQUAL(type.is_error(), expect_error); EXPECT_EQUAL(type.is_double(), expect_double); EXPECT_EQUAL(type.is_tensor(), expect_tensor); - EXPECT_EQUAL(type.maybe_tensor(), expect_maybe_tensor); - EXPECT_EQUAL(type.is_abstract(), expect_abstract); - EXPECT_EQUAL(type.unknown_dimensions(), expect_unknown_dimensions); + EXPECT_EQUAL(type.is_sparse(), expect_sparse); + EXPECT_EQUAL(type.is_dense(), expect_dense); } TEST("require that type-related predicate functions work as expected") { - TEST_DO(verify_predicates(ValueType::any_type(), - true, false, false, false, - true, true, true)); - TEST_DO(verify_predicates(ValueType::error_type(), - false, true, false, false, - false, false, false)); - TEST_DO(verify_predicates(ValueType::double_type(), - false, false, true, false, - false, false, false)); - TEST_DO(verify_predicates(ValueType::tensor_type({}), - false, false, false, true, - true, true, true)); - TEST_DO(verify_predicates(ValueType::tensor_type({{"x"}}), - false, false, false, true, - true, false, false)); - TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 0}}), - false, false, false, true, - true, true, false)); + TEST_DO(verify_predicates(ValueType::error_type(), true, false, false, false, false)); + TEST_DO(verify_predicates(ValueType::double_type(), false, true, false, false, false)); + TEST_DO(verify_predicates(ValueType::tensor_type({}), false, true, false, false, false)); + TEST_DO(verify_predicates(ValueType::tensor_type({{"x"}}), false, false, true, true, false)); + TEST_DO(verify_predicates(ValueType::tensor_type({{"x"},{"y"}}), false, false, true, true, false)); + TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5}}), false, false, true, false, true)); + TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5},{"y", 10}}), false, false, true, false, true)); + TEST_DO(verify_predicates(ValueType::tensor_type({{"x", 5}, {"y"}}), false, false, true, false, false)); } TEST("require that dimension predicates work as expected") { - ValueType type = ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}); - ASSERT_EQUAL(3u, type.dimensions().size()); - EXPECT_TRUE(type.dimensions()[0].is_mapped()); - EXPECT_TRUE(!type.dimensions()[0].is_indexed()); - EXPECT_TRUE(!type.dimensions()[0].is_bound()); - EXPECT_TRUE(!type.dimensions()[1].is_mapped()); - EXPECT_TRUE(type.dimensions()[1].is_indexed()); - EXPECT_TRUE(type.dimensions()[1].is_bound()); - EXPECT_TRUE(!type.dimensions()[2].is_mapped()); - EXPECT_TRUE(type.dimensions()[2].is_indexed()); - EXPECT_TRUE(!type.dimensions()[2].is_bound()); + ValueType::Dimension x("x"); + ValueType::Dimension y("y", 10); + ValueType::Dimension z("z", 0); + EXPECT_TRUE(x.is_mapped()); + EXPECT_TRUE(!x.is_indexed()); + EXPECT_TRUE(!x.is_bound()); + EXPECT_TRUE(!y.is_mapped()); + EXPECT_TRUE(y.is_indexed()); + EXPECT_TRUE(y.is_bound()); + EXPECT_TRUE(!z.is_mapped()); + EXPECT_TRUE(z.is_indexed()); + EXPECT_TRUE(!z.is_bound()); +} + +TEST("require that use of unbound dimensions result in error types") { + EXPECT_TRUE(ValueType::tensor_type({{"x", 0}}).is_error()); } TEST("require that duplicate dimension names result in error types") { EXPECT_TRUE(ValueType::tensor_type({{"x"}, {"x"}}).is_error()); } -TEST("require that removing dimensions from non-abstract non-tensor types gives error type") { +TEST("require that removing dimensions from non-tensor types gives error type") { EXPECT_TRUE(ValueType::error_type().reduce({"x"}).is_error()); EXPECT_TRUE(ValueType::double_type().reduce({"x"}).is_error()); } -TEST("require that removing dimensions from abstract maybe-tensor types gives any type") { - EXPECT_TRUE(ValueType::any_type().reduce({"x"}).is_any()); - EXPECT_TRUE(ValueType::tensor_type({}).reduce({"x"}).is_any()); -} - TEST("require that dimensions can be removed from tensor value types") { ValueType type = ValueType::tensor_type({{"x", 10}, {"y", 20}, {"z", 30}}); EXPECT_EQUAL(ValueType::tensor_type({{"y", 20}, {"z", 30}}), type.reduce({"x"})); @@ -187,30 +169,22 @@ TEST("require that removing all dimensions gives double type") { EXPECT_EQUAL(ValueType::double_type(), type.reduce({"x", "y", "z"})); } -TEST("require that dimensions can be combined for tensor value types") { +TEST("require that dimensions can be combined for value types") { ValueType tensor_type_xy = ValueType::tensor_type({{"x"}, {"y"}}); ValueType tensor_type_yz = ValueType::tensor_type({{"y"}, {"z"}}); ValueType tensor_type_xyz = ValueType::tensor_type({{"x"}, {"y"}, {"z"}}); ValueType tensor_type_y = ValueType::tensor_type({{"y"}}); + ValueType tensor_type_a10 = ValueType::tensor_type({{"a", 10}}); + ValueType tensor_type_a10xyz = ValueType::tensor_type({{"a", 10}, {"x"}, {"y"}, {"z"}}); + ValueType scalar = ValueType::double_type(); + EXPECT_EQUAL(ValueType::join(scalar, scalar), scalar); EXPECT_EQUAL(ValueType::join(tensor_type_xy, tensor_type_yz), tensor_type_xyz); EXPECT_EQUAL(ValueType::join(tensor_type_yz, tensor_type_xy), tensor_type_xyz); EXPECT_EQUAL(ValueType::join(tensor_type_y, tensor_type_y), tensor_type_y); -} - -TEST("require that indexed dimensions combine to the minimal dimension size") { - ValueType tensor_0 = ValueType::tensor_type({{"x", 0}}); - ValueType tensor_10 = ValueType::tensor_type({{"x", 10}}); - ValueType tensor_20 = ValueType::tensor_type({{"x", 20}}); - EXPECT_EQUAL(ValueType::join(tensor_10, tensor_0), tensor_0); - EXPECT_EQUAL(ValueType::join(tensor_10, tensor_10), tensor_10); - EXPECT_EQUAL(ValueType::join(tensor_10, tensor_20), tensor_10); -} - -void verify_combinable(const ValueType &a, const ValueType &b) { - EXPECT_TRUE(!ValueType::join(a, b).is_error()); - EXPECT_TRUE(!ValueType::join(b, a).is_error()); - EXPECT_TRUE(!ValueType::join(a, b).is_any()); - EXPECT_TRUE(!ValueType::join(b, a).is_any()); + EXPECT_EQUAL(ValueType::join(scalar, tensor_type_y), tensor_type_y); + EXPECT_EQUAL(ValueType::join(tensor_type_a10, tensor_type_a10), tensor_type_a10); + EXPECT_EQUAL(ValueType::join(tensor_type_a10, scalar), tensor_type_a10); + EXPECT_EQUAL(ValueType::join(tensor_type_xyz, tensor_type_a10), tensor_type_a10xyz); } void verify_not_combinable(const ValueType &a, const ValueType &b) { @@ -218,70 +192,49 @@ void verify_not_combinable(const ValueType &a, const ValueType &b) { EXPECT_TRUE(ValueType::join(b, a).is_error()); } -void verify_maybe_combinable(const ValueType &a, const ValueType &b) { - EXPECT_TRUE(ValueType::join(a, b).is_any()); - EXPECT_TRUE(ValueType::join(b, a).is_any()); -} - TEST("require that mapped and indexed dimensions are not combinable") { verify_not_combinable(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x"}})); } -TEST("require that dimension combining is only allowed (yes/no/maybe) for appropriate types") { - std::vector<ValueType> types = { ValueType::any_type(), ValueType::error_type(), ValueType::double_type(), - ValueType::tensor_type({}), ValueType::tensor_type({{"x"}}) }; - for (size_t a = 0; a < types.size(); ++a) { - for (size_t b = a; b < types.size(); ++b) { - TEST_STATE(vespalib::make_string("a='%s', b='%s'", types[a].to_spec().c_str(), types[b].to_spec().c_str()).c_str()); - if (types[a].is_error() || types[b].is_error()) { - verify_not_combinable(types[a], types[b]); - } else if (types[a].is_any() || types[b].is_any()) { - verify_maybe_combinable(types[a], types[b]); - } else if (types[a].is_double() || types[b].is_double()) { - verify_combinable(types[a], types[b]); - } else if (types[a].unknown_dimensions() || types[b].unknown_dimensions()) { - verify_maybe_combinable(types[a], types[b]); - } else { - verify_combinable(types[a], types[b]); - } - } - } +TEST("require that indexed dimensions of different sizes are not combinable") { + verify_not_combinable(ValueType::tensor_type({{"x", 10}}), ValueType::tensor_type({{"x", 20}})); +} + +TEST("require that error type combined with anything produces error type") { + verify_not_combinable(ValueType::error_type(), ValueType::error_type()); + verify_not_combinable(ValueType::error_type(), ValueType::double_type()); + verify_not_combinable(ValueType::error_type(), ValueType::tensor_type({{"x"}})); + verify_not_combinable(ValueType::error_type(), ValueType::tensor_type({{"x", 10}})); } TEST("require that value type can make spec") { - EXPECT_EQUAL("any", ValueType::any_type().to_spec()); EXPECT_EQUAL("error", ValueType::error_type().to_spec()); EXPECT_EQUAL("double", ValueType::double_type().to_spec()); - EXPECT_EQUAL("tensor", ValueType::tensor_type({}).to_spec()); + EXPECT_EQUAL("double", ValueType::tensor_type({}).to_spec()); EXPECT_EQUAL("tensor(x{})", ValueType::tensor_type({{"x"}}).to_spec()); EXPECT_EQUAL("tensor(y[10])", ValueType::tensor_type({{"y", 10}}).to_spec()); - EXPECT_EQUAL("tensor(z[])", ValueType::tensor_type({{"z", 0}}).to_spec()); - EXPECT_EQUAL("tensor(x{},y[10],z[])", ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}).to_spec()); + EXPECT_EQUAL("tensor(x{},y[10],z[5])", ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}).to_spec()); } TEST("require that value type spec can be parsed") { - EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec("any")); EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec("double")); EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor")); EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec("tensor()")); EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec("tensor(x{})")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor(y[10])")); - EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec("tensor(z[])")); - EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}), ValueType::from_spec("tensor(x{},y[10],z[])")); + EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}), ValueType::from_spec("tensor(x{},y[10],z[5])")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor<double>(y[10])")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec("tensor<float>(y[10])")); } TEST("require that value type spec can be parsed with extra whitespace") { - EXPECT_EQUAL(ValueType::any_type(), ValueType::from_spec(" any ")); EXPECT_EQUAL(ValueType::double_type(), ValueType::from_spec(" double ")); EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor ")); EXPECT_EQUAL(ValueType::tensor_type({}), ValueType::from_spec(" tensor ( ) ")); EXPECT_EQUAL(ValueType::tensor_type({{"x"}}), ValueType::from_spec(" tensor ( x { } ) ")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor ( y [ 10 ] ) ")); - EXPECT_EQUAL(ValueType::tensor_type({{"z", 0}}), ValueType::from_spec(" tensor ( z [ ] ) ")); - EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 0}}), - ValueType::from_spec(" tensor ( x { } , y [ 10 ] , z [ ] ) ")); + EXPECT_EQUAL(ValueType::tensor_type({{"x"}, {"y", 10}, {"z", 5}}), + ValueType::from_spec(" tensor ( x { } , y [ 10 ] , z [ 5 ] ) ")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor < double > ( y [ 10 ] ) ")); EXPECT_EQUAL(ValueType::tensor_type({{"y", 10}}), ValueType::from_spec(" tensor < float > ( y [ 10 ] ) ")); } @@ -290,6 +243,7 @@ TEST("require that malformed value type spec is parsed as error") { EXPECT_TRUE(ValueType::from_spec("").is_error()); EXPECT_TRUE(ValueType::from_spec(" ").is_error()); EXPECT_TRUE(ValueType::from_spec("error").is_error()); + EXPECT_TRUE(ValueType::from_spec("any").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor tensor").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor(x{10})").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor(x{},)").is_error()); @@ -304,6 +258,7 @@ TEST("require that malformed value type spec is parsed as error") { EXPECT_TRUE(ValueType::from_spec("tensor(x{},x{})").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[10])").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor(x{},x[])").is_error()); + EXPECT_TRUE(ValueType::from_spec("tensor(z[])").is_error()); EXPECT_TRUE(ValueType::from_spec("tensor<float16>(x[10])").is_error()); } @@ -327,15 +282,8 @@ ParseResult::ParseResult(const vespalib::string &spec_in) ParseResult::~ParseResult() { } TEST("require that we can parse a partial string into a type with the low-level API") { - ParseResult result("tensor(a[]) , "); - EXPECT_EQUAL(result.type, ValueType::tensor_type({{"a", 0}})); - ASSERT_TRUE(result.after_inside()); - EXPECT_EQUAL(*result.after, ','); -} - -TEST("require that we can parse an abstract tensor type from a partial string") { - ParseResult result("tensor , "); - EXPECT_EQUAL(result.type, ValueType::tensor_type({})); + ParseResult result("tensor(a[5]) , "); + EXPECT_EQUAL(result.type, ValueType::tensor_type({{"a", 5}})); ASSERT_TRUE(result.after_inside()); EXPECT_EQUAL(*result.after, ','); } @@ -349,55 +297,28 @@ TEST("require that 'error' is the valid representation of the error type") { EXPECT_TRUE(invalid.after == nullptr); // parse not ok } -TEST("require that a sparse type must be a tensor with dimensions that all are mapped") { - EXPECT_TRUE(ValueType::from_spec("tensor(x{})").is_sparse()); - EXPECT_TRUE(ValueType::from_spec("tensor(x{},y{})").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("tensor()").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("tensor(x[])").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("tensor(x{},y[])").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("double").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("any").is_sparse()); - EXPECT_FALSE(ValueType::from_spec("error").is_sparse()); -} - -TEST("require that a dense type must be a tensor with dimensions that all are indexed") { - EXPECT_TRUE(ValueType::from_spec("tensor(x[])").is_dense()); - EXPECT_TRUE(ValueType::from_spec("tensor(x[],y[])").is_dense()); - EXPECT_FALSE(ValueType::from_spec("tensor()").is_dense()); - EXPECT_FALSE(ValueType::from_spec("tensor(x{})").is_dense()); - EXPECT_FALSE(ValueType::from_spec("tensor(x[],y{})").is_dense()); - EXPECT_FALSE(ValueType::from_spec("double").is_dense()); - EXPECT_FALSE(ValueType::from_spec("any").is_dense()); - EXPECT_FALSE(ValueType::from_spec("error").is_dense()); -} - TEST("require that tensor dimensions can be renamed") { EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({"x"}, {"y"}), ValueType::from_spec("tensor(y{})")); - EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y[])").rename({"x","y"}, {"y","x"}), - ValueType::from_spec("tensor(y{},x[])")); + EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y[5])").rename({"x","y"}, {"y","x"}), + ValueType::from_spec("tensor(y{},x[5])")); EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({"x"}, {"x"}), ValueType::from_spec("tensor(x{})")); EXPECT_EQUAL(ValueType::from_spec("tensor(x{})").rename({}, {}), ValueType::error_type()); EXPECT_EQUAL(ValueType::double_type().rename({}, {}), ValueType::error_type()); EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y{})").rename({"x"}, {"y","z"}), ValueType::error_type()); EXPECT_EQUAL(ValueType::from_spec("tensor(x{},y{})").rename({"x","y"}, {"z"}), ValueType::error_type()); - EXPECT_EQUAL(ValueType::tensor_type({}).rename({"x"}, {"y"}), ValueType::any_type()); - EXPECT_EQUAL(ValueType::any_type().rename({"x"}, {"y"}), ValueType::any_type()); EXPECT_EQUAL(ValueType::double_type().rename({"a"}, {"b"}), ValueType::error_type()); EXPECT_EQUAL(ValueType::error_type().rename({"a"}, {"b"}), ValueType::error_type()); } TEST("require that types can be concatenated") { ValueType error = ValueType::error_type(); - ValueType any = ValueType::any_type(); - ValueType tensor = ValueType::tensor_type({}); ValueType scalar = ValueType::double_type(); ValueType vx_2 = ValueType::from_spec("tensor(x[2])"); ValueType vx_m = ValueType::from_spec("tensor(x{})"); ValueType vx_3 = ValueType::from_spec("tensor(x[3])"); ValueType vx_5 = ValueType::from_spec("tensor(x[5])"); - ValueType vx_any = ValueType::from_spec("tensor(x[])"); ValueType vy_7 = ValueType::from_spec("tensor(y[7])"); ValueType mxy_22 = ValueType::from_spec("tensor(x[2],y[2])"); ValueType mxy_52 = ValueType::from_spec("tensor(x[5],y[2])"); @@ -407,30 +328,20 @@ TEST("require that types can be concatenated") { EXPECT_EQUAL(ValueType::concat(error, vx_2, "x"), error); EXPECT_EQUAL(ValueType::concat(vx_2, error, "x"), error); - EXPECT_EQUAL(ValueType::concat(error, any, "x"), error); - EXPECT_EQUAL(ValueType::concat(any, error, "x"), error); EXPECT_EQUAL(ValueType::concat(vx_m, vx_2, "x"), error); EXPECT_EQUAL(ValueType::concat(vx_2, vx_m, "x"), error); EXPECT_EQUAL(ValueType::concat(vx_m, vx_m, "x"), error); EXPECT_EQUAL(ValueType::concat(vx_m, scalar, "x"), error); EXPECT_EQUAL(ValueType::concat(scalar, vx_m, "x"), error); + EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "y"), error); EXPECT_EQUAL(ValueType::concat(vy_7, vx_m, "z"), cxyz_m72); - EXPECT_EQUAL(ValueType::concat(tensor, vx_2, "x"), any); - EXPECT_EQUAL(ValueType::concat(vx_2, tensor, "x"), any); - EXPECT_EQUAL(ValueType::concat(any, vx_2, "x"), any); - EXPECT_EQUAL(ValueType::concat(vx_2, any, "x"), any); - EXPECT_EQUAL(ValueType::concat(any, tensor, "x"), any); - EXPECT_EQUAL(ValueType::concat(tensor, any, "x"), any); EXPECT_EQUAL(ValueType::concat(scalar, scalar, "x"), vx_2); EXPECT_EQUAL(ValueType::concat(vx_2, scalar, "x"), vx_3); EXPECT_EQUAL(ValueType::concat(scalar, vx_2, "x"), vx_3); EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "x"), vx_5); - EXPECT_EQUAL(ValueType::concat(vx_2, vx_any, "x"), vx_any); - EXPECT_EQUAL(ValueType::concat(vx_any, vx_2, "x"), vx_any); EXPECT_EQUAL(ValueType::concat(scalar, vx_2, "y"), mxy_22); EXPECT_EQUAL(ValueType::concat(vx_2, scalar, "y"), mxy_22); - EXPECT_EQUAL(ValueType::concat(vx_2, vx_3, "y"), mxy_22); - EXPECT_EQUAL(ValueType::concat(vx_3, vx_2, "y"), mxy_22); + EXPECT_EQUAL(ValueType::concat(vx_2, vx_2, "y"), mxy_22); EXPECT_EQUAL(ValueType::concat(mxy_22, vx_3, "x"), mxy_52); EXPECT_EQUAL(ValueType::concat(vx_3, mxy_22, "x"), mxy_52); EXPECT_EQUAL(ValueType::concat(mxy_22, vy_7, "y"), mxy_29); @@ -438,34 +349,4 @@ TEST("require that types can be concatenated") { EXPECT_EQUAL(ValueType::concat(vx_5, vy_7, "z"), cxyz_572); } -TEST("require that 'either' gives appropriate type") { - ValueType error = ValueType::error_type(); - ValueType any = ValueType::any_type(); - ValueType tensor = ValueType::tensor_type({}); - ValueType scalar = ValueType::double_type(); - ValueType vx_2 = ValueType::from_spec("tensor(x[2])"); - ValueType vx_m = ValueType::from_spec("tensor(x{})"); - ValueType vx_3 = ValueType::from_spec("tensor(x[3])"); - ValueType vx_any = ValueType::from_spec("tensor(x[])"); - ValueType vy_2 = ValueType::from_spec("tensor(y[2])"); - ValueType mxy_22 = ValueType::from_spec("tensor(x[2],y[2])"); - ValueType mxy_23 = ValueType::from_spec("tensor(x[2],y[3])"); - ValueType mxy_32 = ValueType::from_spec("tensor(x[3],y[2])"); - ValueType mxy_any2 = ValueType::from_spec("tensor(x[],y[2])"); - ValueType mxy_2any = ValueType::from_spec("tensor(x[2],y[])"); - - EXPECT_EQUAL(ValueType::either(vx_2, error), error); - EXPECT_EQUAL(ValueType::either(error, vx_2), error); - EXPECT_EQUAL(ValueType::either(vx_2, vx_2), vx_2); - EXPECT_EQUAL(ValueType::either(vx_2, scalar), any); - EXPECT_EQUAL(ValueType::either(scalar, vx_2), any); - EXPECT_EQUAL(ValueType::either(vx_2, mxy_22), tensor); - EXPECT_EQUAL(ValueType::either(tensor, vx_2), tensor); - EXPECT_EQUAL(ValueType::either(vx_2, vy_2), tensor); - EXPECT_EQUAL(ValueType::either(vx_2, vx_m), tensor); - EXPECT_EQUAL(ValueType::either(vx_2, vx_3), vx_any); - EXPECT_EQUAL(ValueType::either(mxy_22, mxy_23), mxy_2any); - EXPECT_EQUAL(ValueType::either(mxy_32, mxy_22), mxy_any2); -} - TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp b/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp index ce321b7c3c3..9b46fc3393a 100644 --- a/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp +++ b/eval/src/tests/tensor/dense_add_dimension_optimizer/dense_add_dimension_optimizer_test.cpp @@ -27,7 +27,6 @@ EvalFixture::ParamRepo make_params() { .add("x5", spec({x(5)}, N())) .add("x5y1", spec({x(5),y(1)}, N())) .add("y1z1", spec({y(1),z(1)}, N())) - .add("x5_u", spec({x(5)}, N()), "tensor(x[])") .add("x_m", spec({x({"a"})}, N())); } EvalFixture::ParamRepo param_repo = make_params(); @@ -80,15 +79,11 @@ TEST("require that non-canonical dimension addition is not optimized") { } TEST("require that dimension addition with overlapping dimensions is not optimized") { - TEST_DO(verify_not_optimized("x5*tensor(x[1],y[1])(1)")); - TEST_DO(verify_not_optimized("tensor(x[1],y[1])(1)*x5")); TEST_DO(verify_not_optimized("x5y1*tensor(y[1],z[1])(1)")); TEST_DO(verify_not_optimized("tensor(y[1],z[1])(1)*x5y1")); } TEST("require that dimension addition with inappropriate dimensions is not optimized") { - TEST_DO(verify_not_optimized("x5_u*tensor(y[1])(1)")); - TEST_DO(verify_not_optimized("tensor(y[1])(1)*x5_u")); TEST_DO(verify_not_optimized("x_m*tensor(y[1])(1)")); TEST_DO(verify_not_optimized("tensor(y[1])(1)*x_m")); } diff --git a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp index 60830e4abd7..fae5db75618 100644 --- a/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp +++ b/eval/src/tests/tensor/dense_dot_product_function/dense_dot_product_function_test.cpp @@ -62,11 +62,6 @@ TEST("require that basic dot product with equal sizes is correct") { check_gen_with_result(2, 2, (3.0 * 5.0) + (4.0 * 6.0)); } -TEST("require that basic dot product with un-equal sizes is correct") { - check_gen_with_result(2, 3, (3.0 * 5.0) + (4.0 * 6.0)); - check_gen_with_result(3, 2, (3.0 * 5.0) + (4.0 * 6.0)); -} - //----------------------------------------------------------------------------- void assertDotProduct(size_t numCells) { @@ -98,18 +93,6 @@ TEST("require that dot product with equal sizes is correct") { TEST_DO(assertDotProduct(1024 + 3)); } -TEST("require that dot product with un-equal sizes is correct") { - TEST_DO(assertDotProduct(8, 8 + 3)); - TEST_DO(assertDotProduct(8 + 3, 8)); - TEST_DO(assertDotProduct(16, 16 + 3)); - TEST_DO(assertDotProduct(32, 32 + 3)); - TEST_DO(assertDotProduct(64, 64 + 3)); - TEST_DO(assertDotProduct(128, 128 + 3)); - TEST_DO(assertDotProduct(256, 256 + 3)); - TEST_DO(assertDotProduct(512, 512 + 3)); - TEST_DO(assertDotProduct(1024, 1024 + 3)); -} - //----------------------------------------------------------------------------- EvalFixture::ParamRepo make_params() { @@ -120,14 +103,8 @@ EvalFixture::ParamRepo make_params() { .add("v04_y3", spec({y(3)}, MyVecSeq(10))) .add("v05_x5", spec({x(5)}, MyVecSeq(6.0))) .add("v06_x5", spec({x(5)}, MyVecSeq(7.0))) - .add("v07_x3_a", spec({x(3)}, MyVecSeq(8.0)), "any") - .add("v08_x3_u", spec({x(3)}, MyVecSeq(9.0)), "tensor(x[])") - .add("v09_x4_u", spec({x(4)}, MyVecSeq(3.0)), "tensor(x[])") .add("m01_x3y3", spec({x(3),y(3)}, MyVecSeq(1.0))) - .add("m02_x2y3", spec({x(2),y(3)}, MyVecSeq(2.0))) - .add("m03_x3y2", spec({x(3),y(2)}, MyVecSeq(3.0))) - .add("m04_xuy3", spec({x(3),y(3)}, MyVecSeq(4.0)), "tensor(x[],y[3])") - .add("m05_x3yu", spec({x(3),y(3)}, MyVecSeq(5.0)), "tensor(x[3],y[])"); + .add("m02_x3y3", spec({x(3),y(3)}, MyVecSeq(2.0))); } EvalFixture::ParamRepo param_repo = make_params(); @@ -146,11 +123,6 @@ void assertNotOptimized(const vespalib::string &expr) { EXPECT_TRUE(info.empty()); } -TEST("require that dot product is not optimized for unknown types") { - TEST_DO(assertNotOptimized("reduce(v02_x3*v07_x3_a,sum)")); - TEST_DO(assertNotOptimized("reduce(v07_x3_a*v03_x3,sum)")); -} - TEST("require that dot product works with tensor function") { TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum)")); TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum,x)")); @@ -162,18 +134,11 @@ TEST("require that dot product with compatible dimensions is optimized") { TEST_DO(assertOptimized("reduce(v01_x1*v01_x1,sum)")); TEST_DO(assertOptimized("reduce(v02_x3*v03_x3,sum)")); TEST_DO(assertOptimized("reduce(v05_x5*v06_x5,sum)")); - - TEST_DO(assertOptimized("reduce(v02_x3*v06_x5,sum)")); - TEST_DO(assertOptimized("reduce(v05_x5*v03_x3,sum)")); - TEST_DO(assertOptimized("reduce(v08_x3_u*v05_x5,sum)")); - TEST_DO(assertOptimized("reduce(v05_x5*v08_x3_u,sum)")); } TEST("require that dot product with incompatible dimensions is NOT optimized") { TEST_DO(assertNotOptimized("reduce(v02_x3*v04_y3,sum)")); TEST_DO(assertNotOptimized("reduce(v04_y3*v02_x3,sum)")); - TEST_DO(assertNotOptimized("reduce(v08_x3_u*v04_y3,sum)")); - TEST_DO(assertNotOptimized("reduce(v04_y3*v08_x3_u,sum)")); TEST_DO(assertNotOptimized("reduce(v02_x3*m01_x3y3,sum)")); TEST_DO(assertNotOptimized("reduce(m01_x3y3*v02_x3,sum)")); } @@ -188,11 +153,8 @@ TEST("require that expressions similar to dot product are not optimized") { } TEST("require that multi-dimensional dot product can be optimized") { - TEST_DO(assertOptimized("reduce(m01_x3y3*m02_x2y3,sum)")); - TEST_DO(assertOptimized("reduce(m02_x2y3*m01_x3y3,sum)")); - TEST_DO(assertOptimized("reduce(m01_x3y3*m04_xuy3,sum)")); - TEST_DO(assertOptimized("reduce(m04_xuy3*m01_x3y3,sum)")); - TEST_DO(assertOptimized("reduce(m04_xuy3*m04_xuy3,sum)")); + TEST_DO(assertOptimized("reduce(m01_x3y3*m02_x3y3,sum)")); + TEST_DO(assertOptimized("reduce(m02_x3y3*m01_x3y3,sum)")); } TEST("require that result must be double to trigger optimization") { @@ -201,14 +163,6 @@ TEST("require that result must be double to trigger optimization") { TEST_DO(assertNotOptimized("reduce(m01_x3y3*m01_x3y3,sum,y)")); } -TEST("require that additional dimensions must have matching size") { - TEST_DO(assertOptimized("reduce(m01_x3y3*m01_x3y3,sum)")); - TEST_DO(assertNotOptimized("reduce(m01_x3y3*m03_x3y2,sum)")); - TEST_DO(assertNotOptimized("reduce(m03_x3y2*m01_x3y3,sum)")); - TEST_DO(assertNotOptimized("reduce(m01_x3y3*m05_x3yu,sum)")); - TEST_DO(assertNotOptimized("reduce(m05_x3yu*m01_x3y3,sum)")); -} - void verify_compatible(const vespalib::string &a, const vespalib::string &b) { auto a_type = ValueType::from_spec(a); auto b_type = ValueType::from_spec(b); @@ -231,13 +185,9 @@ TEST("require that type compatibility test is appropriate") { TEST_DO(verify_compatible("tensor(x[5])", "tensor(x[5])")); TEST_DO(verify_not_compatible("tensor(x[5])", "tensor(y[5])")); TEST_DO(verify_compatible("tensor(x[5])", "tensor(x[3])")); - TEST_DO(verify_compatible("tensor(x[])", "tensor(x[3])")); TEST_DO(verify_compatible("tensor(x[3],y[7],z[9])", "tensor(x[5],y[7],z[9])")); - TEST_DO(verify_compatible("tensor(x[3],y[7],z[9])", "tensor(x[],y[7],z[9])")); TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[9])", "tensor(x[5],y[5],z[9])")); - TEST_DO(verify_not_compatible("tensor(x[5],y[],z[9])", "tensor(x[5],y[7],z[9])")); TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[9])", "tensor(x[5],y[7],z[5])")); - TEST_DO(verify_not_compatible("tensor(x[5],y[7],z[])", "tensor(x[5],y[7],z[9])")); } //----------------------------------------------------------------------------- diff --git a/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp b/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp index c892ed02808..10b4c622a0a 100644 --- a/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp +++ b/eval/src/tests/tensor/dense_fast_rename_optimizer/dense_fast_rename_optimizer_test.cpp @@ -25,7 +25,6 @@ const TensorEngine &prod_engine = DefaultTensorEngine::ref(); EvalFixture::ParamRepo make_params() { return EvalFixture::ParamRepo() .add("x5", spec({x(5)}, N())) - .add("x5_u", spec({x(5)}, N()), "tensor(x[])") .add("x_m", spec({x({"a", "b", "c"})}, N())) .add("x5y3", spec({x(5),y(3)}, N())); } @@ -64,10 +63,6 @@ TEST("require that transposing dense renames are not optimized") { TEST_DO(verify_not_optimized("rename(x5y3,(y,x),(a,b))")); } -TEST("require that abstract dense renames are not optimized") { - TEST_DO(verify_not_optimized("rename(x5_u,x,y)")); -} - TEST("require that non-dense renames are not optimized") { TEST_DO(verify_not_optimized("rename(x_m,x,y)")); } diff --git a/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp b/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp index 3a5b27965d0..7ee603e1763 100644 --- a/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp +++ b/eval/src/tests/tensor/dense_inplace_join_function/dense_inplace_join_function_test.cpp @@ -45,10 +45,8 @@ EvalFixture::ParamRepo make_params() { .add_mutable("mut_x5_A", spec({x(5)}, seq)) .add_mutable("mut_x5_B", spec({x(5)}, seq)) .add_mutable("mut_x5_C", spec({x(5)}, seq)) - .add_mutable("mut_x4", spec({x(4)}, seq)) .add_mutable("mut_x5y3_A", spec({x(5),y(3)}, seq)) .add_mutable("mut_x5y3_B", spec({x(5),y(3)}, seq)) - .add_mutable("mut_x5_unbound", spec({x(5)}, seq), "tensor(x[])") .add_mutable("mut_x_sparse", spec({x({"a", "b", "c"})}, seq)); } EvalFixture::ParamRepo param_repo = make_params(); @@ -112,8 +110,6 @@ TEST("require that join(tensor,scalar) operations are not optimized") { } TEST("require that join with different tensor shapes are not optimized") { - TEST_DO(verify_not_optimized("mut_x5_A-mut_x4")); - TEST_DO(verify_not_optimized("mut_x4-mut_x5_A")); TEST_DO(verify_not_optimized("mut_x5_A*mut_x5y3_B")); } @@ -124,12 +120,6 @@ TEST("require that inplace join operations can be chained") { TEST_DO(verify_p2_optimized("con_x5_A-(con_x5_B-mut_x5_C)", 2)); } -TEST("require that abstract tensors are not optimized") { - TEST_DO(verify_not_optimized("mut_x5_unbound+mut_x5_A")); - TEST_DO(verify_not_optimized("mut_x5_A+mut_x5_unbound")); - TEST_DO(verify_not_optimized("mut_x5_unbound+mut_x5_unbound")); -} - TEST("require that non-mutable tensors are not optimized") { TEST_DO(verify_not_optimized("con_x5_A+con_x5_B")); } diff --git a/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp b/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp index 77af747a066..a17b7e02eb8 100644 --- a/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp +++ b/eval/src/tests/tensor/dense_inplace_map_function/dense_inplace_map_function_test.cpp @@ -27,7 +27,6 @@ EvalFixture::ParamRepo make_params() { .add_mutable("_d", spec(5.0)) .add_mutable("_x5", spec({x(5)}, N())) .add_mutable("_x5y3", spec({x(5),y(3)}, N())) - .add_mutable("_x5_u", spec({x(5)}, N()), "tensor(x[])") .add_mutable("_x_m", spec({x({"a", "b", "c"})}, N())); } EvalFixture::ParamRepo param_repo = make_params(); @@ -60,10 +59,6 @@ TEST("require that inplace map operations can be chained") { TEST_DO(verify_optimized("map(map(_x5,f(x)(x+10)),f(x)(x-5))", 2)); } -TEST("require that abstract tensors are not optimized") { - TEST_DO(verify_not_optimized("map(_x5_u,f(x)(x+10))")); -} - TEST("require that non-mutable tensors are not optimized") { TEST_DO(verify_not_optimized("map(x5,f(x)(x+10))")); } diff --git a/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp b/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp index b87393c2980..ac451d10b50 100644 --- a/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp +++ b/eval/src/tests/tensor/dense_remove_dimension_optimizer/dense_remove_dimension_optimizer_test.cpp @@ -26,7 +26,6 @@ EvalFixture::ParamRepo make_params() { return EvalFixture::ParamRepo() .add("x1y5z1", spec({x(1),y(5),z(1)}, N())) .add("x1y1z1", spec({x(1),y(1),z(1)}, N())) - .add("x1y5z1_u", spec({x(1),y(5),z(1)}, N()), "tensor(x[1],y[5],z[])") .add("x1y5z_m", spec({x(1),y(5),z({"a"})}, N())); } EvalFixture::ParamRepo param_repo = make_params(); @@ -74,8 +73,6 @@ TEST("require that full reduce is not optimized") { } TEST("require that inappropriate tensor types cannot be optimized") { - TEST_DO(verify_not_optimized("reduce(x1y5z1_u,sum,x)")); - TEST_DO(verify_not_optimized("reduce(x1y5z1_u,sum,z)")); TEST_DO(verify_not_optimized("reduce(x1y5z_m,sum,x)")); TEST_DO(verify_not_optimized("reduce(x1y5z_m,sum,z)")); } diff --git a/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp index f18e72b0d07..b55e223ab07 100644 --- a/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp +++ b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp @@ -49,12 +49,7 @@ EvalFixture::ParamRepo make_params() { .add("x8y5", spec({x(8),y(5)}, MyMatSeq())) .add("y5z8", spec({y(5),z(8)}, MyMatSeq())) .add("x5y16", spec({x(5),y(16)}, MyMatSeq())) - .add("y16z5", spec({y(16),z(5)}, MyMatSeq())) - .add("a_y3", spec({y(3)}, MyVecSeq()), "any") - .add("y3_u", spec({y(3)}, MyVecSeq()), "tensor(y[])") - .add("a_x2y3", spec({x(2),y(3)}, MyMatSeq()), "any") - .add("x2_uy3", spec({x(2),y(3)}, MyMatSeq()), "tensor(x[],y[3])") - .add("x2y3_u", spec({x(2),y(3)}, MyMatSeq()), "tensor(x[2],y[])"); + .add("y16z5", spec({y(16),z(5)}, MyMatSeq())); } EvalFixture::ParamRepo param_repo = make_params(); @@ -91,14 +86,6 @@ TEST("require that xw product gives same results as reference join/reduce") { TEST_DO(verify_optimized("reduce(y16*y16z5,sum,y)", 16, 5, false)); } -TEST("require that xw product is not optimized for abstract types") { - TEST_DO(verify_not_optimized("reduce(a_y3*x2y3,sum)")); - TEST_DO(verify_not_optimized("reduce(y3*a_x2y3,sum)")); - TEST_DO(verify_not_optimized("reduce(y3_u*x2y3,sum)")); - TEST_DO(verify_not_optimized("reduce(y3*x2_uy3,sum)")); - TEST_DO(verify_not_optimized("reduce(y3*x2y3_u,sum)")); -} - TEST("require that various variants of xw product can be optimized") { TEST_DO(verify_optimized("reduce(y3*x2y3,sum,y)", 3, 2, true)); TEST_DO(verify_optimized("reduce(x2y3*y3,sum,y)", 3, 2, true)); @@ -118,8 +105,6 @@ TEST("require that expressions similar to xw product are not optimized") { } TEST("require that xw products with incompatible dimensions are not optimized") { - TEST_DO(verify_not_optimized("reduce(y3*x1y1,sum,y)")); - TEST_DO(verify_not_optimized("reduce(y3*x8y5,sum,y)")); TEST_DO(verify_not_optimized("reduce(y3*x2z3,sum,y)")); TEST_DO(verify_not_optimized("reduce(y3*x2z3,sum,z)")); } diff --git a/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp b/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp index 124295a500d..60b17930f0b 100644 --- a/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp +++ b/eval/src/tests/tensor/tensor_mapper/tensor_mapper_test.cpp @@ -96,48 +96,6 @@ TEST("require that sparse tensors can be mapped to dense type") { .add({{"x",1},{"y",2}}, 0))); } -TEST("require that sparse tensors can be mapped to abstract dense type") { - TEST_DO(verify(TensorSpec("tensor(x{},y{})") - .add({{"x","0"},{"y","0"}}, 1) - .add({{"x","1"},{"y","0"}}, 3) - .add({{"x","0"},{"y","1"}}, 5) - .add({{"x","10"},{"y","1"}}, 7), - "tensor(x[2],y[])", - TensorSpec("tensor(x[2],y[2])") - .add({{"x",0},{"y",0}}, 1) - .add({{"x",0},{"y",1}}, 5) - .add({{"x",1},{"y",0}}, 3) - .add({{"x",1},{"y",1}}, 0))); - - TEST_DO(verify(TensorSpec("tensor(x{},y{})") - .add({{"x","0"},{"y","0"}}, 1) - .add({{"x","1"},{"y","0"}}, 3) - .add({{"x","0"},{"y","1"}}, 5) - .add({{"x","2"},{"y","0"}}, 7), - "tensor(x[],y[])", - TensorSpec("tensor(x[3],y[2])") - .add({{"x",0},{"y",0}}, 1) - .add({{"x",0},{"y",1}}, 5) - .add({{"x",1},{"y",0}}, 3) - .add({{"x",1},{"y",1}}, 0) - .add({{"x",2},{"y",0}}, 7) - .add({{"x",2},{"y",1}}, 0))); - - TEST_DO(verify(TensorSpec("tensor(x{},y{})") - .add({{"x","0"},{"y","0"}}, 1) - .add({{"x","1"},{"y","0"}}, 3) - .add({{"x","0"},{"y","1"}}, 5) - .add({{"x","10"},{"y","3"}}, 7), - "tensor(x[],y[3])", - TensorSpec("tensor(x[2],y[3])") - .add({{"x",0},{"y",0}}, 1) - .add({{"x",0},{"y",1}}, 5) - .add({{"x",0},{"y",2}}, 0) - .add({{"x",1},{"y",0}}, 3) - .add({{"x",1},{"y",1}}, 0) - .add({{"x",1},{"y",2}}, 0))); -} - TEST("require that dense tensors can be mapped to sparse type") { TEST_DO(verify(TensorSpec("tensor(x[2],y[2])") .add({{"x",0},{"y",0}}, 1) @@ -168,7 +126,7 @@ TEST("require that mixed tensors can be mapped to dense type") { .add({{"x",0},{"y","1"}}, 3) .add({{"x",1},{"y","0"}}, 5) .add({{"x",1},{"y","1"}}, 7), - "tensor(y[])", + "tensor(y[2])", TensorSpec("tensor(y[2])") .add({{"y",0}}, 6) .add({{"y",1}}, 10))); @@ -180,7 +138,7 @@ TEST("require that mixed tensors can be mapped to mixed type") { .add({{"x",0},{"y","1"}}, 3) .add({{"x",1},{"y","0"}}, 5) .add({{"x",1},{"y","1"}}, 7), - "tensor(x{},y[])", + "tensor(x{},y[2])", TensorSpec("tensor(x{},y[2])") .add({{"x","0"},{"y",0}}, 1) .add({{"x","0"},{"y",1}}, 3) @@ -194,7 +152,7 @@ TEST("require that dense tensors can be mapped to mixed type") { .add({{"x",0},{"y",1}}, 3) .add({{"x",1},{"y",0}}, 5) .add({{"x",1},{"y",1}}, 7), - "tensor(x{},y[])", + "tensor(x{},y[2])", TensorSpec("tensor(x{},y[2])") .add({{"x","0"},{"y",0}}, 1) .add({{"x","0"},{"y",1}}, 3) @@ -208,7 +166,7 @@ TEST("require that sparse tensors can be mapped to mixed type") { .add({{"x","0"},{"y","1"}}, 3) .add({{"x","1"},{"y","0"}}, 5) .add({{"x","1"},{"y","1"}}, 7), - "tensor(x[],y{})", + "tensor(x[2],y{})", TensorSpec("tensor(x[2],y{})") .add({{"x",0},{"y","0"}}, 1) .add({{"x",0},{"y","1"}}, 3) @@ -225,14 +183,14 @@ TEST("require that missing dimensions are added appropriately") { TEST_DO(verify(TensorSpec("tensor(x[1])") .add({{"x",0}}, 42), - "tensor(x[1],y[],z[2])", + "tensor(x[1],y[1],z[2])", TensorSpec("tensor(x[1],y[1],z[2])") .add({{"x",0},{"y",0},{"z",0}}, 42) .add({{"x",0},{"y",0},{"z",1}}, 0))); TEST_DO(verify(TensorSpec("tensor(a{})") .add({{"a","foo"}}, 42), - "tensor(a{},b[],c{},d[2])", + "tensor(a{},b[1],c{},d[2])", TensorSpec("tensor(a{},b[1],c{},d[2])") .add({{"a","foo"},{"b",0},{"c",""},{"d",0}}, 42) .add({{"a","foo"},{"b",0},{"c",""},{"d",1}}, 0))); diff --git a/eval/src/vespa/eval/eval/node_types.cpp b/eval/src/vespa/eval/eval/node_types.cpp index c85c81b3752..94e69aadf55 100644 --- a/eval/src/vespa/eval/eval/node_types.cpp +++ b/eval/src/vespa/eval/eval/node_types.cpp @@ -183,7 +183,7 @@ TypeResolver::~TypeResolver() {} } // namespace vespalib::eval::nodes NodeTypes::NodeTypes() - : _not_found(ValueType::any_type()), + : _not_found(ValueType::error_type()), _type_map() { } diff --git a/eval/src/vespa/eval/eval/node_types.h b/eval/src/vespa/eval/eval/node_types.h index 0b049598f4c..a9ddf371c31 100644 --- a/eval/src/vespa/eval/eval/node_types.h +++ b/eval/src/vespa/eval/eval/node_types.h @@ -16,7 +16,7 @@ class Function; * calculations for a single function. The constructor performs type * resolution for each node in the AST based on the type of all * function parameters. The default constructor creates an empty type - * repo representing an unknown number of unknown values. + * repo where all lookups will result in error types. **/ class NodeTypes { diff --git a/eval/src/vespa/eval/eval/simple_tensor.cpp b/eval/src/vespa/eval/eval/simple_tensor.cpp index 1bce8983666..36c18183c8a 100644 --- a/eval/src/vespa/eval/eval/simple_tensor.cpp +++ b/eval/src/vespa/eval/eval/simple_tensor.cpp @@ -24,7 +24,6 @@ constexpr uint32_t FLOAT_CELL_TYPE = 1; void assert_type(const ValueType &type) { (void) type; - assert(!type.is_abstract()); assert(type.is_double() || type.is_tensor()); } diff --git a/eval/src/vespa/eval/eval/test/eval_fixture.cpp b/eval/src/vespa/eval/eval/test/eval_fixture.cpp index bd4dcc37e3c..321b472a3fa 100644 --- a/eval/src/vespa/eval/eval/test/eval_fixture.cpp +++ b/eval/src/vespa/eval/eval/test/eval_fixture.cpp @@ -68,7 +68,6 @@ std::vector<Value::UP> make_params(const TensorEngine &engine, const Function &f auto pos = param_repo.map.find(function.param_name(i)); ASSERT_TRUE(pos != param_repo.map.end()); result.push_back(engine.from_spec(pos->second.value)); - ASSERT_TRUE(!result.back()->type().is_abstract()); } return result; } diff --git a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp index 7060bb76544..8cbc7507592 100644 --- a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp +++ b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp @@ -597,14 +597,6 @@ struct TestContext { spec({x(1),y(1)}, Seq({ 3 })), spec({x(1),y(1)}, Seq({ 5 })))); TEST_DO(test_apply_op(eval, - spec(x(1), Seq({ op(3, 0) })), - spec(x(1), Seq({ 3 })), - spec(x(2), Seq({ 0, 7 })))); - TEST_DO(test_apply_op(eval, - spec(x(1), Seq({ op(0, 5) })), - spec(x(2), Seq({ 0, 3 })), - spec(x(1), Seq({ 5 })))); - TEST_DO(test_apply_op(eval, spec({x(2),y(2),z(2)}, Seq({ op(1, 7), op(1, 11), op(2, 13), op(2, 17), @@ -623,11 +615,9 @@ struct TestContext { std::vector<Layout> layouts = { {}, {}, {x(5)}, {x(5)}, - {x(5)}, {x(3)}, {x(5)}, {y(5)}, {x(5)}, {x(5),y(5)}, {y(3)}, {x(2),z(3)}, - {x(3),y(5)}, {x(4),y(4)}, {x(3),y(5)}, {y(5),z(7)}, {x({"a","b","c"})}, {x({"a","b","c"})}, {x({"a","b","c"})}, {x({"a","b"})}, @@ -696,12 +686,6 @@ struct TestContext { TEST_DO(test_dot_product(((2 * 7) + (3 * 11) + (5 * 13)), spec(x(3), Seq({ 2, 3, 5 })), spec(x(3), Seq({ 7, 11, 13 })))); - TEST_DO(test_dot_product(((2 * 7) + (3 * 11)), - spec(x(2), Seq({ 2, 3 })), - spec(x(3), Seq({ 7, 11, 13 })))); - TEST_DO(test_dot_product(((2 * 7) + (3 * 11)), - spec(x(3), Seq({ 2, 3, 5 })), - spec(x(2), Seq({ 7, 11 })))); } //------------------------------------------------------------------------- @@ -729,7 +713,7 @@ struct TestContext { spec({x(4),y(2)}, Seq({1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 6.0})))); TEST_DO(test_concat(spec(z(3), Seq({1.0, 2.0, 3.0})), spec(y(2), Seq({4.0, 5.0})), "x", spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0})))); - TEST_DO(test_concat(spec(y(3), Seq({1.0, 2.0, 3.0})), spec(y(2), Seq({4.0, 5.0})), "x", + TEST_DO(test_concat(spec(y(2), Seq({1.0, 2.0})), spec(y(2), Seq({4.0, 5.0})), "x", spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0})))); } diff --git a/eval/src/vespa/eval/eval/value_type.cpp b/eval/src/vespa/eval/eval/value_type.cpp index 1d49fe494b7..269f17b71c5 100644 --- a/eval/src/vespa/eval/eval/value_type.cpp +++ b/eval/src/vespa/eval/eval/value_type.cpp @@ -20,11 +20,6 @@ size_t my_dimension_index(const std::vector<Dimension> &list, const vespalib::st return ValueType::Dimension::npos; } -Dimension *find_dimension(std::vector<Dimension> &list, const vespalib::string &name) { - size_t idx = my_dimension_index(list, name); - return (idx != ValueType::Dimension::npos) ? &list[idx] : nullptr; -} - const Dimension *find_dimension(const std::vector<Dimension> &list, const vespalib::string &name) { size_t idx = my_dimension_index(list, name); return (idx != ValueType::Dimension::npos) ? &list[idx] : nullptr; @@ -35,50 +30,71 @@ void sort_dimensions(DimensionList &dimensions) { [](const auto &a, const auto &b){ return (a.name < b.name); }); } -bool has_duplicates(const DimensionList &dimensions) { - for (size_t i = 1; i < dimensions.size(); ++i) { - if (dimensions[i - 1].name == dimensions[i].name) { - return true; +bool verify_dimensions(const DimensionList &dimensions) { + for (size_t i = 0; i < dimensions.size(); ++i) { + if (dimensions[i].size == 0) { + return false; + } + if ((i > 0) && (dimensions[i - 1].name == dimensions[i].name)) { + return false; } } - return false; + return true; } -struct DimensionResult { +struct MyJoin { bool mismatch; DimensionList dimensions; - DimensionResult() : mismatch(false), dimensions() {} + vespalib::string concat_dim; + MyJoin(const DimensionList &lhs, const DimensionList &rhs) + : mismatch(false), dimensions(), concat_dim() { my_join(lhs, rhs); } + MyJoin(const DimensionList &lhs, const DimensionList &rhs, vespalib::string concat_dim_in) + : mismatch(false), dimensions(), concat_dim(concat_dim_in) { my_join(lhs, rhs); } + ~MyJoin(); +private: void add(const Dimension &a) { - dimensions.push_back(a); + if (a.name == concat_dim) { + if (a.is_indexed()) { + dimensions.emplace_back(a.name, a.size + 1); + } else { + mismatch = true; + } + } else { + dimensions.push_back(a); + } } void unify(const Dimension &a, const Dimension &b) { - if (a.is_mapped() == b.is_mapped()) { - add(Dimension(a.name, std::min(a.size, b.size))); + if (a.name == concat_dim) { + if (a.is_indexed() && b.is_indexed()) { + dimensions.emplace_back(a.name, a.size + b.size); + } else { + mismatch = true; + } + } else if (a == b) { + add(a); } else { mismatch = true; } } -}; - -DimensionResult my_join(const DimensionList &lhs, const DimensionList &rhs) { - DimensionResult result; - auto pos = rhs.begin(); - auto end = rhs.end(); - for (const Dimension &dim: lhs) { - while ((pos != end) && (pos->name < dim.name)) { - result.add(*pos++); + void my_join(const DimensionList &lhs, const DimensionList &rhs) { + auto pos = rhs.begin(); + auto end = rhs.end(); + for (const Dimension &dim: lhs) { + while ((pos != end) && (pos->name < dim.name)) { + add(*pos++); + } + if ((pos != end) && (pos->name == dim.name)) { + unify(dim, *pos++); + } else { + add(dim); + } } - if ((pos != end) && (pos->name == dim.name)) { - result.unify(dim, *pos++); - } else { - result.add(dim); + while (pos != end) { + add(*pos++); } } - while (pos != end) { - result.add(*pos++); - } - return result; -} +}; +MyJoin::~MyJoin() = default; struct Renamer { const std::vector<vespalib::string> &from; @@ -104,10 +120,11 @@ struct Renamer { constexpr ValueType::Dimension::size_type ValueType::Dimension::npos; ValueType::~ValueType() = default; + bool ValueType::is_sparse() const { - if (!is_tensor() || dimensions().empty()) { + if (dimensions().empty()) { return false; } for (const auto &dim : dimensions()) { @@ -121,7 +138,7 @@ ValueType::is_sparse() const bool ValueType::is_dense() const { - if (!is_tensor() || dimensions().empty()) { + if (dimensions().empty()) { return false; } for (const auto &dim : dimensions()) { @@ -150,14 +167,10 @@ ValueType::dimension_names() const ValueType ValueType::reduce(const std::vector<vespalib::string> &dimensions_in) const { - if (is_error() || is_any()) { - return *this; + if (is_error()) { + return error_type(); } else if (dimensions_in.empty()) { return double_type(); - } else if (!is_tensor()) { - return error_type(); - } else if (_dimensions.empty()) { - return any_type(); } size_t removed = 0; std::vector<Dimension> result; @@ -171,9 +184,6 @@ ValueType::reduce(const std::vector<vespalib::string> &dimensions_in) const if (removed != dimensions_in.size()) { return error_type(); } - if (result.empty()) { - return double_type(); - } return tensor_type(std::move(result)); } @@ -181,12 +191,9 @@ ValueType ValueType::rename(const std::vector<vespalib::string> &from, const std::vector<vespalib::string> &to) const { - if (!maybe_tensor() || from.empty() || (from.size() != to.size())) { + if (from.empty() || (from.size() != to.size())) { return error_type(); } - if (unknown_dimensions()) { - return any_type(); - } Renamer renamer(from, to); std::vector<Dimension> dim_list; for (const auto &dim: _dimensions) { @@ -201,8 +208,11 @@ ValueType::rename(const std::vector<vespalib::string> &from, ValueType ValueType::tensor_type(std::vector<Dimension> dimensions_in) { + if (dimensions_in.empty()) { + return double_type(); + } sort_dimensions(dimensions_in); - if (has_duplicates(dimensions_in)) { + if (!verify_dimensions(dimensions_in)) { return error_type(); } return ValueType(Type::TENSOR, std::move(dimensions_in)); @@ -229,10 +239,8 @@ ValueType::join(const ValueType &lhs, const ValueType &rhs) return rhs; } else if (rhs.is_double()) { return lhs; - } else if (lhs.unknown_dimensions() || rhs.unknown_dimensions()) { - return any_type(); } - DimensionResult result = my_join(lhs._dimensions, rhs._dimensions); + MyJoin result(lhs._dimensions, rhs._dimensions); if (result.mismatch) { return error_type(); } @@ -244,22 +252,12 @@ ValueType::concat(const ValueType &lhs, const ValueType &rhs, const vespalib::st { if (lhs.is_error() || rhs.is_error()) { return error_type(); - } else if (lhs.unknown_dimensions() || rhs.unknown_dimensions()) { - return any_type(); } - DimensionResult result = my_join(lhs._dimensions, rhs._dimensions); - auto lhs_dim = find_dimension(lhs.dimensions(), dimension); - auto rhs_dim = find_dimension(rhs.dimensions(), dimension); - auto res_dim = find_dimension(result.dimensions, dimension); - if (result.mismatch || (res_dim && res_dim->is_mapped())) { + MyJoin result(lhs._dimensions, rhs._dimensions, dimension); + if (result.mismatch) { return error_type(); } - if (res_dim) { - if (res_dim->is_bound()) { - res_dim->size = (lhs_dim ? lhs_dim->size : 1) - + (rhs_dim ? rhs_dim->size : 1); - } - } else { + if (!find_dimension(result.dimensions, dimension)) { result.dimensions.emplace_back(dimension, 2); } return tensor_type(std::move(result.dimensions)); @@ -268,35 +266,10 @@ ValueType::concat(const ValueType &lhs, const ValueType &rhs, const vespalib::st ValueType ValueType::either(const ValueType &one, const ValueType &other) { - if (one.is_error() || other.is_error()) { + if (one != other) { return error_type(); } - if (one == other) { - return one; - } - if (!one.is_tensor() || !other.is_tensor()) { - return any_type(); - } - if (one.dimensions().size() != other.dimensions().size()) { - return tensor_type({}); - } - std::vector<Dimension> dims; - for (size_t i = 0; i < one.dimensions().size(); ++i) { - const Dimension &a = one.dimensions()[i]; - const Dimension &b = other.dimensions()[i]; - if (a.name != b.name) { - return tensor_type({}); - } - if (a.is_mapped() != b.is_mapped()) { - return tensor_type({}); - } - if (a.size == b.size) { - dims.push_back(a); - } else { - dims.emplace_back(a.name, 0); - } - } - return tensor_type(std::move(dims)); + return one; } std::ostream & diff --git a/eval/src/vespa/eval/eval/value_type.h b/eval/src/vespa/eval/eval/value_type.h index 9d95d91ae15..6e30a5c0a47 100644 --- a/eval/src/vespa/eval/eval/value_type.h +++ b/eval/src/vespa/eval/eval/value_type.h @@ -15,7 +15,7 @@ namespace vespalib::eval { class ValueType { public: - enum class Type { ANY, ERROR, DOUBLE, TENSOR }; + enum class Type { ERROR, DOUBLE, TENSOR }; struct Dimension { using size_type = uint32_t; static constexpr size_type npos = -1; @@ -51,7 +51,6 @@ public: ValueType &operator=(const ValueType &) = default; ~ValueType(); Type type() const { return _type; } - bool is_any() const { return (_type == Type::ANY); } bool is_error() const { return (_type == Type::ERROR); } bool is_double() const { return (_type == Type::DOUBLE); } bool is_tensor() const { return (_type == Type::TENSOR); } @@ -60,16 +59,6 @@ public: const std::vector<Dimension> &dimensions() const { return _dimensions; } size_t dimension_index(const vespalib::string &name) const; std::vector<vespalib::string> dimension_names() const; - bool maybe_tensor() const { return (is_any() || is_tensor()); } - bool unknown_dimensions() const { return (maybe_tensor() && _dimensions.empty()); } - bool is_abstract() const { - for (const auto &dimension: _dimensions) { - if (dimension.is_indexed() && !dimension.is_bound()) { - return true; - } - } - return (is_any() || (is_tensor() && (dimensions().empty()))); - } bool operator==(const ValueType &rhs) const { return ((_type == rhs._type) && (_dimensions == rhs._dimensions)); } @@ -79,8 +68,7 @@ public: ValueType rename(const std::vector<vespalib::string> &from, const std::vector<vespalib::string> &to) const; - static ValueType any_type() { return ValueType(Type::ANY); } - static ValueType error_type() { return ValueType(Type::ERROR); }; + static ValueType error_type() { return ValueType(Type::ERROR); } static ValueType double_type() { return ValueType(Type::DOUBLE); } static ValueType tensor_type(std::vector<Dimension> dimensions_in); static ValueType from_spec(const vespalib::string &spec); diff --git a/eval/src/vespa/eval/eval/value_type_spec.cpp b/eval/src/vespa/eval/eval/value_type_spec.cpp index 6076988ad50..737943f902e 100644 --- a/eval/src/vespa/eval/eval/value_type_spec.cpp +++ b/eval/src/vespa/eval/eval/value_type_spec.cpp @@ -167,9 +167,7 @@ parse_spec(const char *pos_in, const char *end_in, const char *&pos_out) { ParseContext ctx(pos_in, end_in, pos_out); vespalib::string type_name = parse_ident(ctx); - if (type_name == "any") { - return ValueType::any_type(); - } else if (type_name == "error") { + if (type_name == "error") { return ValueType::error_type(); } else if (type_name == "double") { return ValueType::double_type(); @@ -206,9 +204,6 @@ to_spec(const ValueType &type) asciistream os; size_t cnt = 0; switch (type.type()) { - case ValueType::Type::ANY: - os << "any"; - break; case ValueType::Type::ERROR: os << "error"; break; diff --git a/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp index cd874186e46..f55566fe199 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_add_dimension_optimizer.cpp @@ -20,7 +20,7 @@ using namespace eval::operation; namespace { bool is_concrete_dense_tensor(const ValueType &type) { - return (type.is_dense() && !type.is_abstract()); + return type.is_dense(); } bool not_overlapping(const ValueType &a, const ValueType &b) { diff --git a/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp index 4bc2458c29d..b32a1efa234 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_fast_rename_optimizer.cpp @@ -22,8 +22,8 @@ bool is_concrete_dense_stable_rename(const ValueType &from_type, const ValueType const std::vector<vespalib::string> &from, const std::vector<vespalib::string> &to) { - if (!from_type.is_dense() || from_type.is_abstract() || - !to_type.is_dense() || to_type.is_abstract() || + if (!from_type.is_dense() || + !to_type.is_dense() || (from.size() != to.size())) { return false; diff --git a/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp index b3ed588a74a..4828808683a 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_inplace_join_function.cpp @@ -41,7 +41,7 @@ void my_inplace_join_op(eval::InterpretedFunction::State &state, uint64_t param) } bool sameShapeConcreteDenseTensors(const ValueType &a, const ValueType &b) { - return (a.is_dense() && !a.is_abstract() && (a == b)); + return (a.is_dense() && (a == b)); } } // namespace vespalib::tensor::<unnamed> diff --git a/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp index a0aba25f342..bac1e336292 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_inplace_map_function.cpp @@ -30,7 +30,7 @@ void my_inplace_map_op(eval::InterpretedFunction::State &state, uint64_t param) } bool isConcreteDenseTensor(const ValueType &type) { - return (type.is_dense() && !type.is_abstract()); + return type.is_dense(); } } // namespace vespalib::tensor::<unnamed> diff --git a/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp b/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp index 302c81080dd..d6716e8ad1a 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_remove_dimension_optimizer.cpp @@ -15,7 +15,7 @@ using namespace eval::tensor_function; namespace { bool is_concrete_dense_tensor(const ValueType &type) { - return (type.is_dense() && !type.is_abstract()); + return type.is_dense(); } bool is_ident_aggr(Aggr aggr) { diff --git a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp index c7cb16f37fd..660e5e3e0b7 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp @@ -76,7 +76,7 @@ void my_xw_product_op(eval::InterpretedFunction::State &state, uint64_t param) { } bool isConcreteDenseTensor(const ValueType &type, size_t d) { - return (type.is_dense() && (type.dimensions().size() == d) && !type.is_abstract()); + return (type.is_dense() && (type.dimensions().size() == d)); } bool isDenseXWProduct(const ValueType &res, const ValueType &vec, const ValueType &mat) { diff --git a/eval/src/vespa/eval/tensor/tensor_mapper.cpp b/eval/src/vespa/eval/tensor/tensor_mapper.cpp index dbf1965d441..e6358675cea 100644 --- a/eval/src/vespa/eval/tensor/tensor_mapper.cpp +++ b/eval/src/vespa/eval/tensor/tensor_mapper.cpp @@ -102,111 +102,6 @@ SparseTensorMapper<TensorT>::map(const Tensor &tensor, //----------------------------------------------------------------------------- -class TensorTypeMapper : public TensorVisitor -{ - ValueType _type; - std::vector<ValueType::Dimension> _dimensions; - - bool addressOK(const TensorAddress &address); - void expandUnboundDimensions(const TensorAddress &address); - - virtual void visit(const TensorAddress &address, double value) override; - - TensorTypeMapper(const ValueType &type); - ~TensorTypeMapper(); - - ValueType build(); -public: - static ValueType map(const Tensor &tensor, const ValueType &type); -}; - -bool -TensorTypeMapper::addressOK(const TensorAddress &address) -{ - TensorAddressElementIterator<TensorAddress> addressIterator(address); - auto dimIterator = _dimensions.begin(); - for (const auto &dimension : _type.dimensions()) { - if (addressIterator.skipToDimension(dimension.name)) { - if (dimension.is_indexed()) { - uint32_t label = DenseTensorAddressMapper::mapLabelToNumber(addressIterator.label()); - if (label == DenseTensorAddressMapper::BAD_LABEL || - (dimension.is_bound() && label >= dimIterator->size)) { - return false; - } - } - addressIterator.next(); - } - ++dimIterator; - } - assert(dimIterator == _dimensions.end()); - return true; -} - - -void -TensorTypeMapper::expandUnboundDimensions(const TensorAddress &address) -{ - TensorAddressElementIterator<TensorAddress> addressIterator(address); - auto dimIterator = _dimensions.begin(); - for (const auto &dimension : _type.dimensions()) { - if (addressIterator.skipToDimension(dimension.name)) { - if (dimension.is_indexed()) { - uint32_t label = DenseTensorAddressMapper::mapLabelToNumber(addressIterator.label()); - if (label != DenseTensorAddressMapper::BAD_LABEL && - !dimension.is_bound() && - label >= dimIterator->size) { - dimIterator->size = label + 1; - } - } - addressIterator.next(); - } - ++dimIterator; - } - assert(dimIterator == _dimensions.end()); -} - -void -TensorTypeMapper::visit(const TensorAddress &address, double value) -{ - (void) value; - if (addressOK(address)) { - expandUnboundDimensions(address); - } -} - -TensorTypeMapper::TensorTypeMapper(const ValueType &type) - : _type(type), - _dimensions(type.dimensions()) -{ - for (auto &dimension : _dimensions) { - if (dimension.is_indexed()) { - if (!dimension.is_bound()) { - dimension.size = 1; - } - } - } -} - -TensorTypeMapper::~TensorTypeMapper() -{ -} - -ValueType -TensorTypeMapper::build() -{ - return ValueType::tensor_type(std::move(_dimensions)); -} - -ValueType -TensorTypeMapper::map(const Tensor &tensor, const ValueType &type) -{ - TensorTypeMapper mapper(type); - tensor.accept(mapper); - return mapper.build(); -} - -//----------------------------------------------------------------------------- - class DenseTensorMapper : public TensorVisitor { ValueType _type; @@ -259,9 +154,7 @@ DenseTensorMapper::visit(const TensorAddress &address, double value) std::unique_ptr<Tensor> DenseTensorMapper::map(const Tensor &tensor, const ValueType &type) { - DenseTensorMapper mapper(type.is_abstract() ? - TensorTypeMapper::map(tensor, type) : - type); + DenseTensorMapper mapper(type); tensor.accept(mapper); return mapper.build(); } @@ -322,9 +215,7 @@ WrappedTensorMapper::visit(const TensorAddress &address, double value) std::unique_ptr<Tensor> WrappedTensorMapper::map(const Tensor &tensor, const ValueType &type) { - WrappedTensorMapper mapper(type.is_abstract() ? - TensorTypeMapper::map(tensor, type) : - type); + WrappedTensorMapper mapper(type); tensor.accept(mapper); return mapper.build(); } diff --git a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java index c632191e31d..22abddfe924 100644 --- a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java +++ b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; import java.util.logging.Level; @@ -37,7 +38,7 @@ public class Mirror implements IMirror { private final BackOffPolicy backOff; private volatile int updates = 0; private boolean requestDone = false; - private volatile Entry[] specs = new Entry[0]; + private AtomicReference<Entry[]> specs = new AtomicReference<>(new Entry[0]); private int specsGeneration = 0; private final Task updateTask; private final RequestWaiter reqWait; @@ -90,7 +91,7 @@ public class Mirror implements IMirror { public List<Entry> lookup(String pattern) { ArrayList<Entry> found = new ArrayList<>(); char[] p = pattern.toCharArray(); - for (Entry specEntry : specs) { + for (Entry specEntry : specs.get()) { if (match(specEntry.getNameArray(), p)) { found.add(specEntry); } @@ -211,7 +212,7 @@ public class Mirror implements IMirror { for (int idx = 0; idx < numNames; idx++) { newSpecs[idx] = new Entry(n[idx], s[idx]); } - specs = newSpecs; + specs.set(newSpecs); specsGeneration = answer.get(2).asInt32(); int u = (updates + 1); @@ -259,7 +260,7 @@ public class Mirror implements IMirror { } } else { Map<String, Entry> map = new HashMap<>(); - for (Entry e : specs) { + for (Entry e : specs.get()) { map.put(e.getName(), e); } for (String rem : r) { @@ -275,7 +276,7 @@ public class Mirror implements IMirror { } } - specs = newSpecs; + specs.set(newSpecs); specsGeneration = diffToGeneration; int u = (updates + 1); @@ -301,7 +302,7 @@ public class Mirror implements IMirror { target.close(); target = null; } - specs = new Entry[0]; + specs.set(new Entry[0]); } /** diff --git a/parent/pom.xml b/parent/pom.xml index d5e662ed7da..2c8e7264e23 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -122,6 +122,14 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</version> + <dependencies> + <!-- TODO: Remove when upgrading to 3.1.2 --> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-dependency-analyzer</artifactId> + <version>1.11.1</version> + </dependency> + </dependencies> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp index 7b27ba2fa3a..2f952f0957c 100644 --- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp @@ -450,17 +450,19 @@ Proton::~Proton() if (_fs4Server) { _fs4Server->shutDown(); } - // size_t numCores = _protonConfigurer.getActiveConfigSnapshot()->getBootstrapConfig()->getHwInfo().cpu().cores(); - size_t numCores = 4; - const std::shared_ptr<proton::ProtonConfigSnapshot> pcsp = _protonConfigurer.getActiveConfigSnapshot(); - if (pcsp) { - const std::shared_ptr<proton::BootstrapConfig> bcp = pcsp->getBootstrapConfig(); - if (bcp) { - numCores = bcp->getHwInfo().cpu().cores(); + if (_documentDBMap.size() > 0) { + size_t numCores = 4; + const std::shared_ptr<proton::ProtonConfigSnapshot> pcsp = _protonConfigurer.getActiveConfigSnapshot(); + if (pcsp) { + const std::shared_ptr<proton::BootstrapConfig> bcp = pcsp->getBootstrapConfig(); + if (bcp) { + numCores = std::max(bcp->getHwInfo().cpu().cores(), 1u); + } } + + vespalib::ThreadStackExecutor closePool(std::min(_documentDBMap.size(), numCores), 0x20000, close_executor); + closeDocumentDBs(closePool); } - vespalib::ThreadStackExecutor closePool(std::min(_documentDBMap.size(), numCores), 0x20000, close_executor); - closeDocumentDBs(closePool); _documentDBMap.clear(); _persistenceEngine.reset(); _tls.reset(); diff --git a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp index bd814b0ad32..cbbaa518b16 100644 --- a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp +++ b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp @@ -40,9 +40,6 @@ static bool operator==(const Tensor &lhs, const Tensor &rhs) vespalib::string sparseSpec("tensor(x{},y{})"); vespalib::string denseSpec("tensor(x[2],y[3])"); -vespalib::string denseAbstractSpec_xy("tensor(x[],y[])"); -vespalib::string denseAbstractSpec_x("tensor(x[2],y[])"); -vespalib::string denseAbstractSpec_y("tensor(x[],y[3])"); struct Fixture { @@ -307,7 +304,7 @@ Fixture::testSaveLoad() void Fixture::testCompaction() { - if (_useDenseTensorAttribute && _denseTensors && !_cfg.tensorType().is_abstract()) { + if (_useDenseTensorAttribute && _denseTensors) { LOG(info, "Skipping compaction test for tensor '%s' which is using free-lists", _cfg.tensorType().to_spec().c_str()); return; } @@ -411,34 +408,4 @@ TEST("Test dense tensors with dense tensor attribute") testAll([]() { return std::make_shared<Fixture>(denseSpec, true); }); } -TEST("Test dense tensors with generic tensor attribute with unbound x and y dims") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_xy); }); -} - -TEST("Test dense tensors with dense tensor attribute with unbound x and y dims") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_xy, true); }); -} - -TEST("Test dense tensors with generic tensor attribute with unbound x dim") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_x); }); -} - -TEST("Test dense tensors with dense tensor attribute with unbound x dim") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_x, true); }); -} - -TEST("Test dense tensors with generic tensor attribute with unbound y dim") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_y); }); -} - -TEST("Test dense tensors with dense tensor attribute with unbound y dim") -{ - testAll([]() { return std::make_shared<Fixture>(denseAbstractSpec_y, true); }); -} - TEST_MAIN() { TEST_RUN_ALL(); vespalib::unlink("test.dat"); } diff --git a/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp b/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp index 2419f450950..c7c3447a4cc 100644 --- a/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp +++ b/searchlib/src/tests/features/ranking_expression/ranking_expression_test.cpp @@ -54,7 +54,7 @@ ExpressionReplacer::SP make_replacer() { auto replacer = std::make_shared<ListExpressionReplacer>(); replacer->add(std::make_unique<NullExpressionReplacer>()); replacer->add(std::make_unique<DummyReplacer>("foo", FeatureType::number())); - replacer->add(std::make_unique<DummyReplacer>("bar", FeatureType::object(ValueType::from_spec("tensor(x[])")))); + replacer->add(std::make_unique<DummyReplacer>("bar", FeatureType::object(ValueType::from_spec("tensor(x[5])")))); return replacer; } @@ -124,15 +124,6 @@ TEST("require that ranking expression can resolve to concrete complex type") { FeatureType::object(ValueType::from_spec("tensor(x{},y{},z{})")))); } -TEST("require that ranking expression can resolve to abstract complex type") { - TEST_DO(verify_output_type({{"a", "tensor"}}, "a*b", FeatureType::object(ValueType::from_spec("tensor")))); -} - -TEST("require that ranking expression can resolve to 'any' type") { - TEST_DO(verify_output_type({{"a", "tensor(x{},y{})"}, {"b", "tensor"}}, "a*b", - FeatureType::object(ValueType::from_spec("any")))); -} - TEST("require that setup fails for incompatible types") { TEST_DO(verify_setup_fail({{"a", "tensor(x{},y{})"}, {"b", "tensor(y[10],z{})"}}, "a*b")); } @@ -150,7 +141,7 @@ TEST("require that replaced expressions override result type") { TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "foo*b*c", FeatureType::number())); TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "a*b*bar", - FeatureType::object(ValueType::from_spec("tensor(x[])")))); + FeatureType::object(ValueType::from_spec("tensor(x[5])")))); TEST_DO(verify_output_type({{"b", "tensor(z{})"}}, "foo*b*bar", FeatureType::number())); } diff --git a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp index 9f47dede46a..1d80fec720a 100644 --- a/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp +++ b/searchlib/src/tests/tensor/dense_tensor_store/dense_tensor_store_test.cpp @@ -60,34 +60,6 @@ TEST_F("require that we can store 1d bound tensor", Fixture("tensor(x[3])")) add({{"x", 2}}, 5)); } -TEST_F("require that we can store 1d un-bound tensor", Fixture("tensor(x[])")) -{ - f.assertSetAndGetTensor(TensorSpec("tensor(x[3])"). - add({{"x", 0}}, 2). - add({{"x", 1}}, 3). - add({{"x", 2}}, 5)); -} - -TEST_F("require that un-bound dimension is concrete in returned 2d tensor", Fixture("tensor(x[3],y[])")) -{ - f.assertSetAndGetTensor(TensorSpec("tensor(x[3],y[2])"). - add({{"x", 0}, {"y", 0}}, 2). - add({{"x", 0}, {"y", 1}}, 3). - add({{"x", 1}, {"y", 0}}, 5). - add({{"x", 1}, {"y", 1}}, 7). - add({{"x", 2}, {"y", 0}}, 11). - add({{"x", 2}, {"y", 1}}, 13)); -} - -TEST_F("require that un-bound dimensions are concrete in returned 3d tensor", Fixture("tensor(x[],y[2],z[])")) -{ - f.assertSetAndGetTensor(TensorSpec("tensor(x[1],y[2],z[2])"). - add({{"x", 0}, {"y", 0}, {"z", 0}}, 2). - add({{"x", 0}, {"y", 0}, {"z", 1}}, 3). - add({{"x", 0}, {"y", 1}, {"z", 0}}, 5). - add({{"x", 0}, {"y", 1}, {"z", 1}}, 7)); -} - TEST_F("require that correct empty tensor is returned for 1d bound tensor", Fixture("tensor(x[3])")) { f.assertEmptyTensor(TensorSpec("tensor(x[3])"). @@ -96,21 +68,6 @@ TEST_F("require that correct empty tensor is returned for 1d bound tensor", Fixt add({{"x", 2}}, 0)); } -TEST_F("require that empty 2d tensor has size 1 in un-bound dimension", Fixture("tensor(x[3],y[])")) -{ - f.assertEmptyTensor(TensorSpec("tensor(x[3],y[1])"). - add({{"x", 0}, {"y", 0}}, 0). - add({{"x", 1}, {"y", 0}}, 0). - add({{"x", 2}, {"y", 0}}, 0)); -} - -TEST_F("require that empty 3d tensor has size 1 in un-bound dimensions", Fixture("tensor(x[],y[2],z[])")) -{ - f.assertEmptyTensor(TensorSpec("tensor(x[1],y[2],z[1])"). - add({{"x", 0}, {"y", 0}, {"z", 0}}, 0). - add({{"x", 0}, {"y", 1}, {"z", 0}}, 0)); -} - void assertArraySize(const vespalib::string &tensorType, uint32_t expArraySize) { Fixture f(tensorType); @@ -122,13 +79,7 @@ TEST("require that array size is calculated correctly") TEST_DO(assertArraySize("tensor(x[1])", 32)); TEST_DO(assertArraySize("tensor(x[10])", 96)); TEST_DO(assertArraySize("tensor(x[3])", 32)); - TEST_DO(assertArraySize("tensor(x[3],y[])", 32)); - TEST_DO(assertArraySize("tensor(x[3],y[],z[])", 32)); - TEST_DO(assertArraySize("tensor(x[3],y[],z[],z2[])", 64)); TEST_DO(assertArraySize("tensor(x[10],y[10])", 800)); - TEST_DO(assertArraySize("tensor(x[])", 32)); - TEST_DO(assertArraySize("tensor(x[],x2[],x3[],x4[],x5[],x6[])", 32)); - TEST_DO(assertArraySize("tensor(x[],x2[],x3[],x4[],x5[],x6[],x7[])", 64)); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/vespa/searchlib/features/attributefeature.cpp b/searchlib/src/vespa/searchlib/features/attributefeature.cpp index b3ebd0f3822..56d02ce6d4e 100644 --- a/searchlib/src/vespa/searchlib/features/attributefeature.cpp +++ b/searchlib/src/vespa/searchlib/features/attributefeature.cpp @@ -295,10 +295,13 @@ AttributeBlueprint::setup(const search::fef::IIndexEnvironment & env, vespalib::string attrType = type::Attribute::lookup(env.getProperties(), _attrName); if (!attrType.empty()) { _tensorType = ValueType::from_spec(attrType); + if (_tensorType.is_error()) { + LOG(error, "%s: invalid type: '%s'", getName().c_str(), attrType.c_str()); + } } - FeatureType output_type = _tensorType.is_tensor() - ? FeatureType::object(_tensorType) - : FeatureType::number(); + FeatureType output_type = _tensorType.is_double() + ? FeatureType::number() + : FeatureType::object(_tensorType); describeOutput("value", "The value of a single value attribute, " "the value at the given index of an array attribute, " "the given key of a weighted set attribute, or" @@ -309,7 +312,7 @@ AttributeBlueprint::setup(const search::fef::IIndexEnvironment & env, describeOutput("count", "Returns the number of elements in this array or weighted set attribute."); } env.hintAttributeAccess(_attrName); - return true; + return !_tensorType.is_error(); } search::fef::Blueprint::UP diff --git a/searchlib/src/vespa/searchlib/features/constant_feature.cpp b/searchlib/src/vespa/searchlib/features/constant_feature.cpp index 4d76512ab00..ced9d95fb33 100644 --- a/searchlib/src/vespa/searchlib/features/constant_feature.cpp +++ b/searchlib/src/vespa/searchlib/features/constant_feature.cpp @@ -63,8 +63,10 @@ ConstantBlueprint::setup(const IIndexEnvironment &env, { _key = params[0].getValue(); _value = env.getConstantValue(_key); - if (!_value || _value->type().is_error()) { + if (!_value) { LOG(error, "Constant '%s' not found", _key.c_str()); + } else if (_value->type().is_error()) { + LOG(error, "Constant '%s' has invalid type", _key.c_str()); } FeatureType output_type = _value ? FeatureType::object(_value->type()) : diff --git a/searchlib/src/vespa/searchlib/features/queryfeature.cpp b/searchlib/src/vespa/searchlib/features/queryfeature.cpp index eb7eb427283..b9041901ced 100644 --- a/searchlib/src/vespa/searchlib/features/queryfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/queryfeature.cpp @@ -98,12 +98,15 @@ QueryBlueprint::setup(const IIndexEnvironment &env, const ParameterList ¶ms) vespalib::string queryFeatureType = type::QueryFeature::lookup(env.getProperties(), _key); if (!queryFeatureType.empty()) { _valueType = ValueType::from_spec(queryFeatureType); + if (_valueType.is_error()) { + LOG(error, "%s: invalid type: '%s'", getName().c_str(), queryFeatureType.c_str()); + } } - FeatureType output_type = _valueType.is_tensor() - ? FeatureType::object(_valueType) - : FeatureType::number(); + FeatureType output_type = _valueType.is_double() + ? FeatureType::number() + : FeatureType::object(_valueType); describeOutput("out", "The value looked up in query properties using the given key.", output_type); - return true; + return !_valueType.is_error(); } namespace { diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp index 72865d042e7..b2c8c64d55a 100644 --- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp @@ -239,9 +239,6 @@ RankingExpressionBlueprint::setup(const fef::IIndexEnvironment &env, LOG(error, "rank expression contains type errors: %s\n", script.c_str()); return false; } - if (root_type.is_any()) { - LOG(warning, "rank expression could produce run-time type errors: %s\n", script.c_str()); - } auto compile_issues = CompiledFunction::detect_issues(rank_function); auto interpret_issues = InterpretedFunction::detect_issues(rank_function); if (do_compile && compile_issues && !interpret_issues) { diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp index 7b2b2561f91..08c8cc59933 100644 --- a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp +++ b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp @@ -730,6 +730,23 @@ BucketDBUpdater::BucketListGenerator::process(BucketDatabase::Entry& e) return true; } +BucketDBUpdater::NodeRemover::NodeRemover( + const lib::ClusterState& oldState, + const lib::ClusterState& s, + uint16_t localIndex, + const lib::Distribution& distribution, + const char* upStates) + : _oldState(oldState), + _state(s), + _nonOwnedBuckets(), + _removedBuckets(), + _localIndex(localIndex), + _distribution(distribution), + _upStates(upStates), + _cachedDecisionSuperbucket(UINT64_MAX), + _cachedOwned(false) +{} + void BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId, const char* msg) const { @@ -737,14 +754,35 @@ BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId, cons LOG_BUCKET_OPERATION_NO_LOCK(bucketId, msg); } +namespace { + +uint64_t superbucket_from_id(const document::BucketId& id, uint16_t distribution_bits) noexcept { + // The n LSBs of the bucket ID contain the superbucket number. Mask off the rest. + return id.getRawId() & ~(UINT64_MAX << distribution_bits); +} + +} + bool BucketDBUpdater::NodeRemover::distributorOwnsBucket( const document::BucketId& bucketId) const { + // TODO "no distributors available" case is the same for _all_ buckets; cache once in constructor. + // TODO "too few bits used" case can be cheaply checked without needing exception try { - uint16_t distributor( - _distribution.getIdealDistributorNode(_state, bucketId, "uim")); - if (distributor != _localIndex) { + const auto bits = _state.getDistributionBitCount(); + const auto this_superbucket = superbucket_from_id(bucketId, bits); + if (_cachedDecisionSuperbucket == this_superbucket) { + if (!_cachedOwned) { + logRemove(bucketId, "bucket now owned by another distributor (cached)"); + } + return _cachedOwned; + } + + uint16_t distributor = _distribution.getIdealDistributorNode(_state, bucketId, "uim"); + _cachedDecisionSuperbucket = this_superbucket; + _cachedOwned = (distributor == _localIndex); + if (!_cachedOwned) { logRemove(bucketId, "bucket now owned by another distributor"); return false; } diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.h b/storage/src/vespa/storage/distributor/bucketdbupdater.h index 393e1e2524e..9ff732a09f5 100644 --- a/storage/src/vespa/storage/distributor/bucketdbupdater.h +++ b/storage/src/vespa/storage/distributor/bucketdbupdater.h @@ -201,16 +201,9 @@ private: const lib::ClusterState& s, uint16_t localIndex, const lib::Distribution& distribution, - const char* upStates) - : _oldState(oldState), - _state(s), - _nonOwnedBuckets(), - _removedBuckets(), - _localIndex(localIndex), - _distribution(distribution), - _upStates(upStates) {} - + const char* upStates); ~NodeRemover() override; + bool process(BucketDatabase::Entry& e) override; void logRemove(const document::BucketId& bucketId, const char* msg) const; bool distributorOwnsBucket(const document::BucketId&) const; @@ -233,6 +226,9 @@ private: uint16_t _localIndex; const lib::Distribution& _distribution; const char* _upStates; + + mutable uint64_t _cachedDecisionSuperbucket; + mutable bool _cachedOwned; }; std::deque<std::pair<framework::MilliSecTime, BucketRequest> > _delayedRequests; diff --git a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java index 7d6d75e0ee2..0063011e41c 100644 --- a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java +++ b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java @@ -3,13 +3,27 @@ package com.yahoo.vdslib.distribution; import com.yahoo.collections.BobHash; import com.yahoo.config.subscription.ConfigSubscriber; +import com.yahoo.vdslib.state.ClusterState; +import com.yahoo.vdslib.state.DiskState; +import com.yahoo.vdslib.state.Node; +import com.yahoo.vdslib.state.NodeState; +import com.yahoo.vdslib.state.NodeType; +import com.yahoo.vdslib.state.State; import com.yahoo.vespa.config.content.StorDistributionConfig; -import com.yahoo.config.subscription.ConfigSourceSet; -import com.yahoo.vdslib.state.*; import com.yahoo.document.BucketId; -import java.util.*; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.TreeSet; public class Distribution { @@ -27,7 +41,7 @@ public class Distribution { return redundancy; } - private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = new ConfigSubscriber.SingleSubscriber<StorDistributionConfig>() { + private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = new ConfigSubscriber.SingleSubscriber<>() { private int[] getGroupPath(String path) { if (path.equals("invalid")) { return new int[0]; } StringTokenizer st = new StringTokenizer(path, "."); @@ -65,7 +79,6 @@ public class Distribution { if (path.length == 0) { root = group; } else { - assert(root != null); Group parent = root; for (int j=0; j<path.length - 1; ++j) { parent = parent.getSubgroups().get(path[j]); @@ -90,19 +103,12 @@ public class Distribution { }; public Distribution(String configId) { - this(configId, null); - } - public Distribution(String configId, ConfigSourceSet configSources) { int mask = 0; for (int i=0; i<=64; ++i) { distributionBitMasks[i] = mask; mask = (mask << 1) | 1; } - if (configSources==null) { - configSub = new ConfigSubscriber(); - } else { - configSub = new ConfigSubscriber(configSources); - } + configSub = new ConfigSubscriber(); configSub.subscribe(configSubscriber, StorDistributionConfig.class, configId); } @@ -213,7 +219,7 @@ public class Distribution { return group.compareTo(o.group); } } - public void getIdealGroups(BucketId bucketId, ClusterState clusterState, Group parent, + private void getIdealGroups(BucketId bucketId, ClusterState clusterState, Group parent, int redundancy, List<ResultGroup> results) { if (parent.isLeafGroup()) { results.add(new ResultGroup(parent, redundancy)); @@ -311,7 +317,7 @@ public class Distribution { return idealDisk; } - public List<Integer> getIdealStorageNodes(ClusterState clusterState, BucketId bucket, + List<Integer> getIdealStorageNodes(ClusterState clusterState, BucketId bucket, String upStates) throws TooFewBucketBitsInUseException { List<Integer> resultNodes = new ArrayList<>(); @@ -399,12 +405,12 @@ public class Distribution { } public static class TooFewBucketBitsInUseException extends Exception { - public TooFewBucketBitsInUseException(String message) { + TooFewBucketBitsInUseException(String message) { super(message); } } public static class NoDistributorsAvailableException extends Exception { - public NoDistributorsAvailableException(String message) { + NoDistributorsAvailableException(String message) { super(message); } } @@ -504,7 +510,7 @@ public class Distribution { public static String getSimpleGroupConfig(int redundancy, int nodeCount) { return getSimpleGroupConfig(redundancy, nodeCount, StorDistributionConfig.Disk_distribution.Enum.MODULO_BID); } - public static String getSimpleGroupConfig(int redundancy, int nodeCount, StorDistributionConfig.Disk_distribution.Enum diskDistribution) { + private static String getSimpleGroupConfig(int redundancy, int nodeCount, StorDistributionConfig.Disk_distribution.Enum diskDistribution) { StringBuilder sb = new StringBuilder(); sb.append("raw:redundancy ").append(redundancy).append("\n").append("group[4]\n"); diff --git a/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java b/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java index 9dab7e46a88..b13b6230d3e 100644 --- a/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java +++ b/vdslib/src/main/java/com/yahoo/vdslib/state/ClusterState.java @@ -3,7 +3,12 @@ package com.yahoo.vdslib.state; import com.yahoo.text.StringUtilities; import java.text.ParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.TreeSet; /** * Be careful about changing this class, as it mirrors the ClusterState in C++. @@ -127,7 +132,7 @@ public class ClusterState implements Cloneable { } private Set<Node> unionNodeSetWith(final Set<Node> otherNodes) { - final Set<Node> unionNodeSet = new TreeSet<Node>(nodeStates.keySet()); + final Set<Node> unionNodeSet = new TreeSet<>(nodeStates.keySet()); unionNodeSet.addAll(otherNodes); return unionNodeSet; } @@ -181,7 +186,7 @@ public class ClusterState implements Cloneable { Node node = new Node(NodeType.STORAGE, 0); StringBuilder sb = new StringBuilder(); - public void addNodeState() throws ParseException { + void addNodeState() throws ParseException { if (!empty) { NodeState ns = NodeState.deserialize(node.getType(), sb.toString()); if (!ns.equals(defaultUpNodeState(node.getType()))) { @@ -234,13 +239,11 @@ public class ClusterState implements Cloneable { break; case 'v': if (key.equals("version")) { - Integer version; try{ - version = Integer.valueOf(value); + setVersion(Integer.valueOf(value)); } catch (Exception e) { throw new ParseException("Illegal version '" + value + "'. Must be an integer, in state: " + serialized, 0); - } - setVersion(version); + } continue; } break; @@ -308,7 +311,7 @@ public class ClusterState implements Cloneable { return getDiff(other).toHtml(); } - public Diff getDiff(ClusterState other) { + private Diff getDiff(ClusterState other) { Diff diff = new Diff(); if (version != other.version) { diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java index 04d45afe2d0..b03a2541cd0 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/SessionFactory.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.http.client; import com.yahoo.vespa.http.client.config.Cluster; import com.yahoo.vespa.http.client.config.Endpoint; import com.yahoo.vespa.http.client.config.SessionParams; -import com.yahoo.vespa.http.client.core.api.SessionImpl; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -31,7 +30,7 @@ public final class SessionFactory { @SuppressWarnings("deprecation") static Session createInternal(SessionParams params) { - return new SessionImpl(params, createTimeoutExecutor()); + return new com.yahoo.vespa.http.client.core.api.SessionImpl(params, createTimeoutExecutor()); } static ScheduledThreadPoolExecutor createTimeoutExecutor() { diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java index e11903d7ba7..a5c97351347 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/core/api/SessionImpl.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.http.client.core.api; import com.yahoo.vespa.http.client.FeedClient; import com.yahoo.vespa.http.client.Result; -import com.yahoo.vespa.http.client.Session; import com.yahoo.vespa.http.client.config.SessionParams; import com.yahoo.vespa.http.client.core.ThrottlePolicy; import com.yahoo.vespa.http.client.core.operationProcessor.IncompleteResultsThrottler; @@ -20,7 +19,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; * @deprecated */ @Deprecated // TODO: Remove on Vespa 8 -public class SessionImpl implements Session { +public class SessionImpl implements com.yahoo.vespa.http.client.Session { private final OperationProcessor operationProcessor; private final BlockingQueue<Result> resultQueue = new LinkedBlockingQueue<>(); diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java index 344f8b46639..08c9299dcde 100644 --- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java +++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/QueueBoundsTest.java @@ -6,7 +6,6 @@ import com.yahoo.vespa.http.client.config.ConnectionParams; import com.yahoo.vespa.http.client.config.Endpoint; import com.yahoo.vespa.http.client.config.FeedParams; import com.yahoo.vespa.http.client.config.SessionParams; -import com.yahoo.vespa.http.client.core.api.SessionImpl; import com.yahoo.vespa.http.client.handlers.V3MockParsingRequestHandler; import org.junit.Test; @@ -65,7 +64,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly { mockXmlParsingRequestHandler.setScenario(V3MockParsingRequestHandler.Scenario.DONT_ACCEPT_VERSION); try (Server server = new Server(mockXmlParsingRequestHandler, 0); Session session = - new SessionImpl( + new com.yahoo.vespa.http.client.core.api.SessionImpl( new SessionParams.Builder() .addCluster(new Cluster.Builder() .addEndpoint(Endpoint.create("localhost", server.getPort(), false)) @@ -109,7 +108,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly { try (Server serverA = new Server(new V3MockParsingRequestHandler("A"), 0); Server serverB = new Server(slowHandler, 0); - SessionImpl session = new SessionImpl( + com.yahoo.vespa.http.client.core.api.SessionImpl session = new com.yahoo.vespa.http.client.core.api.SessionImpl( new SessionParams.Builder() .addCluster(new Cluster.Builder() .addEndpoint(Endpoint.create("localhost", serverA.getPort(), false)) @@ -196,7 +195,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly { mockXmlParsingRequestHandler.setScenario(V3MockParsingRequestHandler.Scenario.DONT_ACCEPT_VERSION); try (Server server = new Server(mockXmlParsingRequestHandler, 0); Session session = - new SessionImpl( + new com.yahoo.vespa.http.client.core.api.SessionImpl( new SessionParams.Builder() .addCluster(new Cluster.Builder() .addEndpoint(Endpoint.create("localhost", server.getPort(), false)) @@ -278,7 +277,7 @@ public class QueueBoundsTest extends TestOnCiBuildingSystemOnly { } } - private void assertIncompleteResultQueueSize(SessionImpl session, int size, long timeout, TimeUnit timeUnit) throws InterruptedException { + private void assertIncompleteResultQueueSize(com.yahoo.vespa.http.client.core.api.SessionImpl session, int size, long timeout, TimeUnit timeUnit) throws InterruptedException { long timeoutMs = TimeUnit.MILLISECONDS.convert(timeout, timeUnit); long waitTimeMs = 0; while (true) { diff --git a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java index 0e1b038e6cd..1fcd5d72a00 100644 --- a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java +++ b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/FeederParams.java @@ -8,33 +8,34 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; /** * @author Simon Thoresen Hult */ class FeederParams { - private InputStream stdIn = System.in; + enum DumpFormat {JSON, VESPA}; private PrintStream stdErr = System.err; private PrintStream stdOut = System.out; private Route route = Route.parse("default"); private String configId = "client"; private OutputStream dumpStream = null; - private boolean serialTransferEnabled = false; + private DumpFormat dumpFormat = DumpFormat.JSON; + private boolean benchmarkMode = false; private int numDispatchThreads = 1; + private int maxPending = 0; + private List<InputStream> inputStreams = new ArrayList<>(); - InputStream getStdIn() { - return stdIn; - } - - FeederParams setStdIn(InputStream stdIn) { - this.stdIn = stdIn; - return this; + FeederParams() { + inputStreams.add(System.in); } PrintStream getStdErr() { @@ -64,6 +65,12 @@ class FeederParams { return this; } + DumpFormat getDumpFormat() { return dumpFormat; } + FeederParams setDumpFormat(DumpFormat dumpFormat) { + this.dumpFormat = dumpFormat; + return this; + } + String getConfigId() { return configId; } @@ -74,33 +81,61 @@ class FeederParams { } boolean isSerialTransferEnabled() { - return serialTransferEnabled; + return maxPending == 1; } - FeederParams setSerialTransfer(boolean serial) { - this.serialTransferEnabled = serial; + FeederParams setSerialTransfer() { + maxPending = 1; + numDispatchThreads = 1; + return this; + } + List<InputStream> getInputStreams() { return inputStreams; } + FeederParams setInputStreams(List<InputStream> inputStreams) { + this.inputStreams = inputStreams; return this; } int getNumDispatchThreads() { return numDispatchThreads; } + int getMaxPending() { return maxPending; } + boolean isBenchmarkMode() { return benchmarkMode; } FeederParams parseArgs(String... args) throws ParseException, FileNotFoundException { Options opts = new Options(); - opts.addOption("s", "serial", false, "use serial transfer mode, at most 1 pending operation"); + opts.addOption("s", "serial", false, "use serial transfer mode, at most 1 pending operation and a single thread"); opts.addOption("n", "numthreads", true, "Number of clients for sending messages. Anything, but 1 will bypass sequencing by document id."); + opts.addOption("m", "maxpending", true, "Max number of inflights messages. Default is auto."); opts.addOption("r", "route", true, "Route for sending messages. default is 'default'...."); - opts.addOption("o", "output", true, "File to write to. Extensions gives format (.xml, .json, .v8) json will be produced if no extension."); + opts.addOption("b", "mode", true, "Mode for benchmarking."); + opts.addOption("o", "output", true, "File to write to. Extensions gives format (.xml, .json, .vespa) json will be produced if no extension."); CommandLine cmd = new DefaultParser().parse(opts, args); - serialTransferEnabled = cmd.hasOption('s'); + if (cmd.hasOption('n')) { numDispatchThreads = Integer.valueOf(cmd.getOptionValue('n').trim()); } + if (cmd.hasOption('m')) { + maxPending = Integer.valueOf(cmd.getOptionValue('m').trim()); + } if (cmd.hasOption('r')) { route = Route.parse(cmd.getOptionValue('r').trim()); } + benchmarkMode = cmd.hasOption('b'); if (cmd.hasOption('o')) { - dumpStream = new FileOutputStream(new File(cmd.getOptionValue('o').trim())); + String fileName = cmd.getOptionValue('o').trim(); + dumpStream = new FileOutputStream(new File(fileName)); + if (fileName.endsWith(".vespa")) { + dumpFormat = DumpFormat.VESPA; + } + } + if (cmd.hasOption('s')) { + setSerialTransfer(); + } + + if ( !cmd.getArgList().isEmpty()) { + inputStreams.clear(); + for (String fileName : cmd.getArgList()) { + inputStreams.add(new FileInputStream(new File(fileName))); + } } return this; diff --git a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java index b4520c0d9e3..32e883f171a 100644 --- a/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java +++ b/vespa_feed_perf/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java @@ -2,14 +2,24 @@ package com.yahoo.vespa.feed.perf; import com.yahoo.concurrent.ThreadFactoryFactory; +import com.yahoo.document.Document; +import com.yahoo.document.DocumentId; import com.yahoo.document.DocumentPut; import com.yahoo.document.DocumentTypeManager; +import com.yahoo.document.DocumentUpdate; +import com.yahoo.document.TestAndSetCondition; import com.yahoo.document.json.JsonFeedReader; import com.yahoo.document.json.JsonWriter; +import com.yahoo.document.serialization.DocumentDeserializer; +import com.yahoo.document.serialization.DocumentDeserializerFactory; +import com.yahoo.document.serialization.DocumentSerializer; +import com.yahoo.document.serialization.DocumentSerializerFactory; +import com.yahoo.document.serialization.DocumentWriter; import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import com.yahoo.documentapi.messagebus.protocol.PutDocumentMessage; import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage; import com.yahoo.documentapi.messagebus.protocol.UpdateDocumentMessage; +import com.yahoo.io.GrowableByteBuffer; import com.yahoo.messagebus.Error; import com.yahoo.messagebus.Message; import com.yahoo.messagebus.MessageBusParams; @@ -21,13 +31,21 @@ import com.yahoo.messagebus.SourceSessionParams; import com.yahoo.messagebus.StaticThrottlePolicy; import com.yahoo.messagebus.network.rpc.RPCNetworkParams; import com.yahoo.messagebus.routing.Route; +import com.yahoo.vespaxmlparser.ConditionalFeedOperation; import com.yahoo.vespaxmlparser.FeedReader; +import com.yahoo.vespaxmlparser.FeedOperation; +import com.yahoo.vespaxmlparser.RemoveFeedOperation; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; +import net.jpountz.xxhash.XXHashFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -40,30 +58,66 @@ import java.util.concurrent.atomic.AtomicReference; */ public class SimpleFeeder implements ReplyHandler { - private final static long REPORT_INTERVAL = TimeUnit.SECONDS.toMillis(10); - private final static long HEADER_INTERVAL = REPORT_INTERVAL * 24; + private final DocumentTypeManager docTypeMgr = new DocumentTypeManager(); - private final InputStream in; + private final List<InputStream> inputStreams; private final PrintStream out; private final RPCMessageBus mbus; private final SourceSession session; + private final int numThreads; + private final Destination destination; + private final boolean benchmarkMode; + private final static long REPORT_INTERVAL = TimeUnit.SECONDS.toMillis(10); private final long startTime = System.currentTimeMillis(); private final AtomicReference<Throwable> failure = new AtomicReference<>(null); private final AtomicLong numReplies = new AtomicLong(0); private long maxLatency = Long.MIN_VALUE; private long minLatency = Long.MAX_VALUE; - private long nextHeader = startTime + HEADER_INTERVAL; private long nextReport = startTime + REPORT_INTERVAL; private long sumLatency = 0; - private final int numThreads; - private final Destination destination; + + static class Metrics { + + private final Destination destination; + private final FeedReader reader; + private final Executor executor; + AtomicReference<Throwable> failure; + + Metrics(Destination destination, FeedReader reader, Executor executor, AtomicReference<Throwable> failure) { + this.destination = destination; + this.reader = reader; + this.executor = executor; + this.failure = failure; + } + + long feed() throws Throwable { + long numMessages = 0; + while (failure.get() == null) { + FeedOperation op = reader.read(); + if (op.getType() == FeedOperation.Type.INVALID) { + break; + } + if (executor != null) { + executor.execute(() -> sendOperation(op)); + } else { + sendOperation(op); + } + ++numMessages; + } + return numMessages; + } + private void sendOperation(FeedOperation op) { + destination.send(op); + } + } + public static void main(String[] args) throws Throwable { new SimpleFeeder(new FeederParams().parseArgs(args)).run().close(); } private interface Destination { - void send(VespaXMLFeedReader.Operation op); + void send(FeedOperation op); void close() throws Exception; } @@ -78,7 +132,7 @@ public class SimpleFeeder implements ReplyHandler { this.session = session; this.failure = failure; } - public void send(VespaXMLFeedReader.Operation op) { + public void send(FeedOperation op) { Message msg = newMessage(op); if (msg == null) { err.println("ignoring operation; " + op.getType()); @@ -100,7 +154,7 @@ public class SimpleFeeder implements ReplyHandler { private static class JsonDestination implements Destination { private final OutputStream outputStream; - private final JsonWriter writer; + private final DocumentWriter writer; private final AtomicLong numReplies; private final AtomicReference<Throwable> failure; private boolean isFirst = true; @@ -116,8 +170,8 @@ public class SimpleFeeder implements ReplyHandler { failure.set(e); } } - public void send(VespaXMLFeedReader.Operation op) { - if (op.getType() == VespaXMLFeedReader.OperationType.DOCUMENT) { + public void send(FeedOperation op) { + if (op.getType() == FeedOperation.Type.DOCUMENT) { if (!isFirst) { try { outputStream.write(','); @@ -137,41 +191,185 @@ public class SimpleFeeder implements ReplyHandler { outputStream.write(']'); outputStream.close(); } + } + static private final int NONE = 0; + static private final int DOCUMENT = 1; + static private final int UPDATE = 2; + static private final int REMOVE = 3; + private static class VespaV1Destination implements Destination { + private final OutputStream outputStream; + GrowableByteBuffer buffer = new GrowableByteBuffer(16384); + ByteBuffer header = ByteBuffer.allocate(16); + private final AtomicLong numReplies; + private final AtomicReference<Throwable> failure; + VespaV1Destination(OutputStream outputStream, AtomicReference<Throwable> failure, AtomicLong numReplies) { + this.outputStream = outputStream; + this.numReplies = numReplies; + this.failure = failure; + try { + outputStream.write('V'); + outputStream.write('1'); + } catch (IOException e) { + failure.set(e); + } + } + public void send(FeedOperation op) { + TestAndSetCondition cond = op.getCondition(); + buffer.putUtf8String(cond.getSelection()); + DocumentSerializer writer = DocumentSerializerFactory.createHead(buffer); + int type = NONE; + if (op.getType() == FeedOperation.Type.DOCUMENT) { + writer.write(op.getDocument()); + type = DOCUMENT; + } else if (op.getType() == FeedOperation.Type.UPDATE) { + writer.write(op.getDocumentUpdate()); + type = UPDATE; + } else if (op.getType() == FeedOperation.Type.REMOVE) { + writer.write(op.getRemove()); + type = REMOVE; + } + int sz = buffer.position(); + long hash = hash(buffer.array(), sz); + try { + header.putInt(sz); + header.putInt(type); + header.putLong(hash); + outputStream.write(header.array(), 0, header.position()); + outputStream.write(buffer.array(), 0, buffer.position()); + header.clear(); + buffer.clear(); + } catch (IOException e) { + failure.set(e); + } + numReplies.incrementAndGet(); + } + public void close() throws Exception { + outputStream.close(); + } + static long hash(byte [] buf, int length) { + return XXHashFactory.fastestJavaInstance().hash64().hash(buf, 0, length, 0); + } + } + + private static int readExact(InputStream in, byte [] buf) throws IOException { + return in.readNBytes(buf, 0, buf.length); + } + + static class VespaV1FeedReader implements FeedReader { + private final InputStream in; + private final DocumentTypeManager mgr; + private final byte[] prefix = new byte[16]; + VespaV1FeedReader(InputStream in, DocumentTypeManager mgr) throws IOException { + this.in = in; + this.mgr = mgr; + byte [] header = new byte[2]; + int read = readExact(in, header); + if ((read != header.length) || (header[0] != 'V') || (header[1] != '1')) { + throw new IllegalArgumentException("Invalid Header " + Arrays.toString(header)); + } + } + + class LazyDocumentOperation extends ConditionalFeedOperation { + private final DocumentDeserializer deserializer; + LazyDocumentOperation(DocumentDeserializer deserializer, TestAndSetCondition condition) { + super(Type.DOCUMENT, condition); + this.deserializer = deserializer; + } + + @Override + public Document getDocument() { + return new Document(deserializer); + } + } + class LazyUpdateOperation extends ConditionalFeedOperation { + private final DocumentDeserializer deserializer; + LazyUpdateOperation(DocumentDeserializer deserializer, TestAndSetCondition condition) { + super(Type.UPDATE, condition); + this.deserializer = deserializer; + } + + @Override + public DocumentUpdate getDocumentUpdate() { + return new DocumentUpdate(deserializer); + } + } + @Override + public FeedOperation read() throws Exception { + int read = readExact(in, prefix); + if (read != prefix.length) { + return FeedOperation.INVALID; + } + ByteBuffer header = ByteBuffer.wrap(prefix); + int sz = header.getInt(); + int type = header.getInt(); + long hash = header.getLong(); + byte [] blob = new byte[sz]; + read = readExact(in, blob); + if (read != blob.length) { + throw new IllegalArgumentException("Underflow, failed reading " + blob.length + "bytes. Got " + read); + } + long computedHash = VespaV1Destination.hash(blob, blob.length); + if (computedHash != hash) { + throw new IllegalArgumentException("Hash mismatch, expected " + hash + ", got " + computedHash); + } + GrowableByteBuffer buf = GrowableByteBuffer.wrap(blob); + String condition = buf.getUtf8String(); + DocumentDeserializer deser = DocumentDeserializerFactory.createHead(mgr, buf); + TestAndSetCondition testAndSetCondition = condition.isEmpty() + ? TestAndSetCondition.NOT_PRESENT_CONDITION + : new TestAndSetCondition(condition); + if (type == DOCUMENT) { + return new LazyDocumentOperation(deser, testAndSetCondition); + } else if (type == UPDATE) { + return new LazyUpdateOperation(deser, testAndSetCondition); + } else if (type == REMOVE) { + return new RemoveFeedOperation(new DocumentId(deser), testAndSetCondition); + } else { + throw new IllegalArgumentException("Unknown operation " + type); + } + } } + private Destination createDumper(FeederParams params) { + if (params.getDumpFormat() == FeederParams.DumpFormat.VESPA) { + return new VespaV1Destination(params.getDumpStream(), failure, numReplies); + } + return new JsonDestination(params.getDumpStream(), failure, numReplies); + } SimpleFeeder(FeederParams params) { - in = params.getStdIn(); + inputStreams = params.getInputStreams(); out = params.getStdOut(); numThreads = params.getNumDispatchThreads(); mbus = newMessageBus(docTypeMgr, params.getConfigId()); - session = newSession(mbus, this, params.isSerialTransferEnabled()); + session = newSession(mbus, this, params.getMaxPending()); docTypeMgr.configure(params.getConfigId()); + benchmarkMode = params.isBenchmarkMode(); destination = (params.getDumpStream() != null) - ? new JsonDestination(params.getDumpStream(), failure, numReplies) + ? createDumper(params) : new MbusDestination(session, params.getRoute(), failure, params.getStdErr()); } - private void sendOperation(VespaXMLFeedReader.Operation op) { - destination.send(op); - } - SourceSession getSourceSession() { return session; } - private FeedReader createFeedReader() throws Exception { + private FeedReader createFeedReader(InputStream in) throws Exception { in.mark(8); - byte [] b = new byte[1]; - int numRead = in.read(b); + byte [] b = new byte[2]; + int numRead = readExact(in, b); in.reset(); if (numRead != b.length) { throw new IllegalArgumentException("Need to read " + b.length + " bytes to detect format. Got " + numRead + " bytes."); } if (b[0] == '[') { return new JsonFeedReader(in, docTypeMgr); + } else if ((b[0] == 'V') && (b[1] == '1')) { + return new VespaV1FeedReader(in, docTypeMgr); } else { return new VespaXMLFeedReader(in, docTypeMgr); } } + + SimpleFeeder run() throws Throwable { ExecutorService executor = (numThreads > 1) ? new ThreadPoolExecutor(numThreads, numThreads, 0L, TimeUnit.SECONDS, @@ -179,30 +377,19 @@ public class SimpleFeeder implements ReplyHandler { ThreadFactoryFactory.getDaemonThreadFactory("perf-feeder"), new ThreadPoolExecutor.CallerRunsPolicy()) : null; - FeedReader reader = createFeedReader(); - - printHeader(); - long numMessages = 0; - while (failure.get() == null) { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - reader.read(op); - if (op.getType() == VespaXMLFeedReader.OperationType.INVALID) { - break; - } - if (executor != null) { - executor.execute(() -> sendOperation(op)); - } else { - sendOperation(op); - } - ++numMessages; + printHeader(out); + long numMessagesSent = 0; + for (InputStream in : inputStreams) { + Metrics m = new Metrics(destination, createFeedReader(in), executor, failure); + numMessagesSent += m.feed(); } - while (failure.get() == null && numReplies.get() < numMessages) { + while (failure.get() == null && numReplies.get() < numMessagesSent) { Thread.sleep(100); } if (failure.get() != null) { throw failure.get(); } - printReport(); + printReport(out); return this; } @@ -211,7 +398,7 @@ public class SimpleFeeder implements ReplyHandler { mbus.destroy(); } - private static Message newMessage(VespaXMLFeedReader.Operation op) { + private static Message newMessage(FeedOperation op) { switch (op.getType()) { case DOCUMENT: { PutDocumentMessage message = new PutDocumentMessage(new DocumentPut(op.getDocument())); @@ -251,23 +438,19 @@ public class SimpleFeeder implements ReplyHandler { minLatency = Math.min(minLatency, latency); maxLatency = Math.max(maxLatency, latency); sumLatency += latency; - if (now > nextHeader) { - printHeader(); - nextHeader += HEADER_INTERVAL; - } + if (benchmarkMode) { return; } if (now > nextReport) { - printReport(); + printReport(out); nextReport += REPORT_INTERVAL; } } - - private void printHeader() { - out.println("total time, num messages, min latency, avg latency, max latency"); + private static void printHeader(PrintStream out) { + out.println("# Time used, num ok, num error, min latency, max latency, average latency"); } - private void printReport() { + private synchronized void printReport(PrintStream out) { out.format("%10d, %12d, %11d, %11d, %11d\n", System.currentTimeMillis() - startTime, - numReplies.get(), minLatency, sumLatency / numReplies.get(), maxLatency); + numReplies.get(), minLatency, maxLatency, sumLatency / Long.max(1, numReplies.get())); } private static String formatErrors(Reply reply) { @@ -285,11 +468,11 @@ public class SimpleFeeder implements ReplyHandler { configId); } - private static SourceSession newSession(RPCMessageBus mbus, ReplyHandler replyHandler, boolean serial) { + private static SourceSession newSession(RPCMessageBus mbus, ReplyHandler replyHandler, int maxPending) { SourceSessionParams params = new SourceSessionParams(); params.setReplyHandler(replyHandler); - if (serial) { - params.setThrottlePolicy(new StaticThrottlePolicy().setMaxPendingCount(1)); + if (maxPending > 0) { + params.setThrottlePolicy(new StaticThrottlePolicy().setMaxPendingCount(maxPending)); } return mbus.getMessageBus().createSourceSession(params); } diff --git a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java index b2800110a39..5cc5d0bc018 100644 --- a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java +++ b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/FeederParamsTest.java @@ -5,13 +5,12 @@ import com.yahoo.messagebus.routing.Route; import org.apache.commons.cli.ParseException; import org.junit.Test; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintStream; import static org.junit.Assert.assertEquals; @@ -25,16 +24,14 @@ import static org.junit.Assert.assertTrue; * @author Simon Thoresen Hult */ public class FeederParamsTest { - static final String TESTFILE = "test.json"; + private static final String TESTFILE_JSON = "test.json"; + private static final String TESTFILE_VESPA = "test.vespa"; + private static final String TESTFILE_UNKNOWN = "test.xyz"; @Test public void requireThatAccessorsWork() { FeederParams params = new FeederParams(); - InputStream stdIn = new ByteArrayInputStream(new byte[1]); - params.setStdIn(stdIn); - assertSame(stdIn, params.getStdIn()); - PrintStream stdErr = new PrintStream(new ByteArrayOutputStream()); params.setStdErr(stdErr); assertSame(stdErr, params.getStdErr()); @@ -46,16 +43,15 @@ public class FeederParamsTest { params.setConfigId("my_config_id"); assertEquals("my_config_id", params.getConfigId()); - params.setSerialTransfer(false); assertFalse(params.isSerialTransferEnabled()); - params.setSerialTransfer(true); + params.setSerialTransfer(); assertTrue(params.isSerialTransferEnabled()); } @Test public void requireThatParamsHaveReasonableDefaults() { FeederParams params = new FeederParams(); - assertSame(System.in, params.getStdIn()); + assertSame(System.in, params.getInputStreams().get(0)); assertSame(System.err, params.getStdErr()); assertSame(System.out, params.getStdOut()); assertEquals(Route.parse("default"), params.getRoute()); @@ -66,16 +62,14 @@ public class FeederParamsTest { @Test public void requireThatSerialTransferOptionIsParsed() throws ParseException, FileNotFoundException { assertTrue(new FeederParams().parseArgs("-s").isSerialTransferEnabled()); - assertTrue(new FeederParams().parseArgs("foo", "-s").isSerialTransferEnabled()); - assertTrue(new FeederParams().parseArgs("-s", "foo").isSerialTransferEnabled()); assertTrue(new FeederParams().parseArgs("--serial").isSerialTransferEnabled()); - assertTrue(new FeederParams().parseArgs("foo", "--serial").isSerialTransferEnabled()); - assertTrue(new FeederParams().parseArgs("--serial", "foo").isSerialTransferEnabled()); + assertEquals(1, new FeederParams().parseArgs("-s").getMaxPending()); + assertEquals(1, new FeederParams().parseArgs("-s").getNumDispatchThreads()); } @Test public void requireThatArgumentsAreParsedAsRoute() throws ParseException, FileNotFoundException { - assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("-r foo bar").getRoute()); + assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("-r", "foo bar").getRoute()); assertEquals(Route.parse("foo bar"), new FeederParams().parseArgs("--route","foo bar").getRoute()); } @@ -94,10 +88,41 @@ public class FeederParamsTest { @Test public void requireThatDumpStreamAreParsed() throws ParseException, IOException { assertNull(new FeederParams().getDumpStream()); - OutputStream dumpStream = new FeederParams().parseArgs("-o " + TESTFILE).getDumpStream(); - assertNotNull(dumpStream); - dumpStream.close(); - assertTrue(new File(TESTFILE).delete()); + + FeederParams p = new FeederParams().parseArgs("-o " + TESTFILE_JSON); + assertNotNull(p.getDumpStream()); + assertEquals(FeederParams.DumpFormat.JSON, p.getDumpFormat()); + p.getDumpStream().close(); + + p = new FeederParams().parseArgs("-o " + TESTFILE_VESPA); + assertNotNull(p.getDumpStream()); + assertEquals(FeederParams.DumpFormat.VESPA, p.getDumpFormat()); + p.getDumpStream().close(); + + p = new FeederParams().parseArgs("-o " + TESTFILE_UNKNOWN); + assertNotNull(p.getDumpStream()); + assertEquals(FeederParams.DumpFormat.JSON, p.getDumpFormat()); + p.getDumpStream().close(); + + assertTrue(new File(TESTFILE_JSON).delete()); + assertTrue(new File(TESTFILE_VESPA).delete()); + assertTrue(new File(TESTFILE_UNKNOWN).delete()); + } + + @Test + public void requireThatInputFilesAreAggregated() throws ParseException, IOException { + File json = new File(TESTFILE_JSON); + File vespa = new File(TESTFILE_VESPA); + new FileOutputStream(json).close(); + new FileOutputStream(vespa).close(); + FeederParams p = new FeederParams(); + p.parseArgs("-n", "3", TESTFILE_JSON, TESTFILE_VESPA); + assertEquals(3, p.getNumDispatchThreads()); + assertEquals(2, p.getInputStreams().size()); + assertTrue(p.getInputStreams().get(0) instanceof FileInputStream); + assertTrue(p.getInputStreams().get(1) instanceof FileInputStream); + json.delete(); + vespa.delete(); } } diff --git a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java index f93657138ca..8af4dd5dac9 100644 --- a/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java +++ b/vespa_feed_perf/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java @@ -11,7 +11,6 @@ import com.yahoo.messagebus.ErrorCode; import com.yahoo.messagebus.Message; import com.yahoo.messagebus.MessageHandler; import com.yahoo.messagebus.Reply; -import com.yahoo.messagebus.SourceSession; import com.yahoo.messagebus.StaticThrottlePolicy; import com.yahoo.messagebus.ThrottlePolicy; import org.junit.Test; @@ -19,9 +18,11 @@ import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.PrintStream; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.regex.Pattern; import static org.junit.Assert.assertEquals; @@ -131,6 +132,42 @@ public class SimpleFeederTest { } @Test + public void requireThatJson2VespaFeederWorks() throws Throwable { + ByteArrayOutputStream dump = new ByteArrayOutputStream(); + assertFeed(new FeederParams().setDumpStream(dump).setDumpFormat(FeederParams.DumpFormat.VESPA), + "[" + + " { \"put\": \"id:simple:simple::0\", \"fields\": { \"my_str\":\"foo\"}}," + + " { \"update\": \"id:simple:simple::1\", \"fields\": { \"my_str\": { \"assign\":\"bar\"}}}," + + " { \"remove\": \"id:simple:simple::2\", \"condition\":\"true\"}" + + "]", + new MessageHandler() { + + @Override + public void handleMessage(Message msg) { + Reply reply = ((DocumentMessage)msg).createReply(); + reply.swapState(msg); + reply.popHandler().handleReply(reply); + } + }, + "", + "(.+\n)+" + + "\\s*\\d+,\\s*3,.+\n"); + assertEquals(187, dump.size()); + assertFeed(new ByteArrayInputStream(dump.toByteArray()), + new MessageHandler() { + @Override + public void handleMessage(Message msg) { + Reply reply = ((DocumentMessage)msg).createReply(); + reply.swapState(msg); + reply.popHandler().handleReply(reply); + } + }, + "", + "(.+\n)+" + + "\\s*\\d+,\\s*3,.+\n"); + } + + @Test public void requireThatJsonFeederWorks() throws Throwable { assertFeed("[" + " { \"put\": \"id:simple:simple::0\", \"fields\": { \"my_str\":\"foo\"}}," + @@ -221,7 +258,7 @@ public class SimpleFeederTest { @Test public void requireThatSerialTransferModeConfiguresStaticThrottling() throws Exception { - TestDriver driver = new TestDriver(new FeederParams().setSerialTransfer(true), "", null); + TestDriver driver = new TestDriver(new FeederParams().setSerialTransfer(), "", null); assertEquals(StaticThrottlePolicy.class, getThrottlePolicy(driver).getClass()); assertTrue(driver.close()); } @@ -243,8 +280,13 @@ public class SimpleFeederTest { private static void assertFeed(String in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable { assertFeed(new FeederParams(), in, validator, expectedErr, expectedOut); } - private static void assertFeed(FeederParams params, String in, MessageHandler validator, String expectedErr, String expectedOut) - throws Throwable { + private static void assertFeed(InputStream in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable { + assertFeed(new FeederParams(), in, validator, expectedErr, expectedOut); + } + private static void assertFeed(FeederParams params, String in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable { + assertFeed(params, new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8)), validator, expectedErr, expectedOut); + } + private static void assertFeed(FeederParams params, InputStream in, MessageHandler validator, String expectedErr, String expectedOut) throws Throwable { TestDriver driver = new TestDriver(params, in, validator); driver.run(); assertMatches(expectedErr, new String(driver.err.toByteArray(), StandardCharsets.UTF_8)); @@ -265,12 +307,14 @@ public class SimpleFeederTest { final SimpleFeeder feeder; final SimpleServer server; - TestDriver(FeederParams params, String in, MessageHandler validator) - throws IOException, ListenFailedException { + TestDriver(FeederParams params, String in, MessageHandler validator) throws IOException, ListenFailedException { + this(params, new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8)), validator); + } + TestDriver(FeederParams params, InputStream in, MessageHandler validator) throws IOException, ListenFailedException { server = new SimpleServer(CONFIG_DIR, validator); feeder = new SimpleFeeder(params.setConfigId("dir:" + CONFIG_DIR) .setStdErr(new PrintStream(err)) - .setStdIn(new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8))) + .setInputStreams(Arrays.asList(in)) .setStdOut(new PrintStream(out))); } diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java index cfa77455f41..a6fdcb10a00 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandler.java @@ -1,7 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.document.restapi; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; +import com.yahoo.vespaxmlparser.FeedOperation; import java.util.Optional; @@ -90,9 +90,9 @@ public interface OperationHandler { VisitResult visit(RestUri restUri, String documentSelection, VisitOptions options) throws RestApiException; - void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException; + void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException; - void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException; + void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException; void delete(RestUri restUri, String condition, Optional<String> route) throws RestApiException; diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java index bfc4a611a5e..b9bbe4f792e 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java @@ -25,6 +25,7 @@ import com.yahoo.messagebus.StaticThrottlePolicy; import com.yahoo.metrics.simple.MetricReceiver; import com.yahoo.vdslib.VisitorOrdering; import com.yahoo.vespaclient.ClusterDef; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import com.yahoo.yolean.concurrent.ConcurrentResourcePool; import com.yahoo.yolean.concurrent.ResourceFactory; @@ -201,7 +202,7 @@ public class OperationHandlerImpl implements OperationHandler { } @Override - public void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException { + public void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException { SyncSession syncSession = syncSessions.alloc(); Response response; try { @@ -225,7 +226,7 @@ public class OperationHandlerImpl implements OperationHandler { } @Override - public void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException { + public void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException { SyncSession syncSession = syncSessions.alloc(); Response response; try { diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java index 880ea2102ab..873b0569553 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/RestApi.java @@ -33,6 +33,8 @@ import com.yahoo.vespa.config.content.LoadTypeConfig; import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig; import com.yahoo.vespaclient.ClusterDef; import com.yahoo.vespaclient.ClusterList; +import com.yahoo.vespaxmlparser.DocumentFeedOperation; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import java.io.IOException; @@ -236,23 +238,21 @@ public class RestApi extends LoggingRequestHandler { return new Response(200, resultJson, Optional.of(restUri)); } - private VespaXMLFeedReader.Operation createPutOperation(HttpRequest request, String id, String condition) { - final VespaXMLFeedReader.Operation operationPut = - singleDocumentParser.parsePut(request.getData(), id); + private FeedOperation createPutOperation(HttpRequest request, String id, String condition) { + FeedOperation put = singleDocumentParser.parsePut(request.getData(), id); if (condition != null && ! condition.isEmpty()) { - operationPut.setCondition(new TestAndSetCondition(condition)); + return new DocumentFeedOperation(put.getDocument(), new TestAndSetCondition(condition)); } - return operationPut; + return put; } - private VespaXMLFeedReader.Operation createUpdateOperation(HttpRequest request, String id, String condition, Optional<Boolean> create) { - final VespaXMLFeedReader.Operation operationUpdate = - singleDocumentParser.parseUpdate(request.getData(), id); + private FeedOperation createUpdateOperation(HttpRequest request, String id, String condition, Optional<Boolean> create) { + FeedOperation update = singleDocumentParser.parseUpdate(request.getData(), id); if (condition != null && ! condition.isEmpty()) { - operationUpdate.getDocumentUpdate().setCondition(new TestAndSetCondition(condition)); + update.getDocumentUpdate().setCondition(new TestAndSetCondition(condition)); } - create.ifPresent(c -> operationUpdate.getDocumentUpdate().setCreateIfNonExistent(c)); - return operationUpdate; + create.ifPresent(c -> update.getDocumentUpdate().setCreateIfNonExistent(c)); + return update; } private HttpResponse handleGet(RestUri restUri, HttpRequest request) throws RestApiException { diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java index ac2c9515d71..947fcb637fb 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/ClientFeederV3.java @@ -17,6 +17,7 @@ import com.yahoo.net.HostName; import com.yahoo.vespa.http.client.core.ErrorCode; import com.yahoo.vespa.http.client.core.Headers; import com.yahoo.vespa.http.client.core.OperationStatus; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import com.yahoo.yolean.Exceptions; @@ -274,7 +275,7 @@ class ClientFeederV3 { /** Returns the next message in the stream, or null if none */ protected DocumentOperationMessageV3 getNextMessage( String operationId, InputStream requestInputStream, FeederSettings settings) throws Exception { - VespaXMLFeedReader.Operation operation = streamReaderV3.getNextOperation(requestInputStream, settings); + FeedOperation operation = streamReaderV3.getNextOperation(requestInputStream, settings); // This is a bit hard to set up while testing, so we accept that things are not perfect. if (sourceSession.getResource().session() != null) { diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java index ca2fdd6b329..6df6bba5a59 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/DocumentOperationMessageV3.java @@ -9,11 +9,7 @@ import com.yahoo.documentapi.messagebus.protocol.RemoveDocumentMessage; import com.yahoo.documentapi.messagebus.protocol.UpdateDocumentMessage; import com.yahoo.jdisc.Metric; import com.yahoo.messagebus.Message; -import com.yahoo.messagebus.routing.ErrorDirective; -import com.yahoo.messagebus.routing.Hop; -import com.yahoo.messagebus.routing.Route; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; -import com.yahoo.yolean.Exceptions; +import com.yahoo.vespaxmlparser.FeedOperation; /** * Keeps an operation with its message. @@ -40,18 +36,7 @@ class DocumentOperationMessageV3 { return operationId; } - static DocumentOperationMessageV3 newErrorMessage(String operationId, Exception exception) { - Message feedErrorMessageV3 = new FeedErrorMessage(operationId); - DocumentOperationMessageV3 msg = new DocumentOperationMessageV3(operationId, feedErrorMessageV3); - Hop hop = new Hop(); - hop.addDirective(new ErrorDirective(Exceptions.toMessageString(exception))); - Route route = new Route(); - route.addHop(hop); - feedErrorMessageV3.setRoute(route); - return msg; - } - - static DocumentOperationMessageV3 newUpdateMessage(VespaXMLFeedReader.Operation op, String operationId) { + private static DocumentOperationMessageV3 newUpdateMessage(FeedOperation op, String operationId) { DocumentUpdate update = op.getDocumentUpdate(); update.setCondition(op.getCondition()); Message msg = new UpdateDocumentMessage(update); @@ -60,7 +45,7 @@ class DocumentOperationMessageV3 { return new DocumentOperationMessageV3(id, msg); } - static DocumentOperationMessageV3 newRemoveMessage(VespaXMLFeedReader.Operation op, String operationId) { + static DocumentOperationMessageV3 newRemoveMessage(FeedOperation op, String operationId) { DocumentRemove remove = new DocumentRemove(op.getRemove()); remove.setCondition(op.getCondition()); Message msg = new RemoveDocumentMessage(remove); @@ -69,7 +54,7 @@ class DocumentOperationMessageV3 { return new DocumentOperationMessageV3(id, msg); } - static DocumentOperationMessageV3 newPutMessage(VespaXMLFeedReader.Operation op, String operationId) { + private static DocumentOperationMessageV3 newPutMessage(FeedOperation op, String operationId) { DocumentPut put = new DocumentPut(op.getDocument()); put.setCondition(op.getCondition()); Message msg = new PutDocumentMessage(put); @@ -78,7 +63,7 @@ class DocumentOperationMessageV3 { return new DocumentOperationMessageV3(id, msg); } - static DocumentOperationMessageV3 create(VespaXMLFeedReader.Operation operation, String operationId, Metric metric) { + static DocumentOperationMessageV3 create(FeedOperation operation, String operationId, Metric metric) { switch (operation.getType()) { case DOCUMENT: metric.add(MetricNames.NUM_PUTS, 1, null /*metricContext*/); diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java index 00290c4fb09..69f810ad4c7 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/StreamReaderV3.java @@ -5,8 +5,8 @@ import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.document.DocumentTypeManager; import com.yahoo.vespa.http.client.core.Encoder; import com.yahoo.vespa.http.server.util.ByteLimitedInputStream; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.FeedReader; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import java.io.IOException; import java.io.InputStream; @@ -30,15 +30,14 @@ public class StreamReaderV3 { this.docTypeManager = docTypeManager; } - public VespaXMLFeedReader.Operation getNextOperation( - InputStream requestInputStream, FeederSettings settings) throws Exception { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); + public FeedOperation getNextOperation(InputStream requestInputStream, FeederSettings settings) throws Exception { + FeedOperation op = null; int length = readByteLength(requestInputStream); try (InputStream limitedInputStream = new ByteLimitedInputStream(requestInputStream, length)){ FeedReader reader = feedReaderFactory.createReader(limitedInputStream, docTypeManager, settings.dataFormat); - reader.read(op); + op = reader.read(); } return op; } diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java index fbaa7f86bd0..1e982c7b700 100644 --- a/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java +++ b/vespaclient-container-plugin/src/test/java/com/yahoo/document/restapi/resource/MockedOperationHandler.java @@ -5,6 +5,7 @@ import com.yahoo.document.restapi.OperationHandler; import com.yahoo.document.restapi.Response; import com.yahoo.document.restapi.RestApiException; import com.yahoo.document.restapi.RestUri; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import java.util.Optional; @@ -31,13 +32,13 @@ public class MockedOperationHandler implements OperationHandler { @Override @SuppressWarnings("deprecation") - public void put(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException { + public void put(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException { log.append("PUT: " + data.getDocument().getId()); log.append(data.getDocument().getBody().toString()); } @Override - public void update(RestUri restUri, VespaXMLFeedReader.Operation data, Optional<String> route) throws RestApiException { + public void update(RestUri restUri, FeedOperation data, Optional<String> route) throws RestApiException { log.append("UPDATE: " + data.getDocumentUpdate().getId()); log.append(data.getDocumentUpdate().fieldUpdates().toString()); if (data.getDocumentUpdate().getCreateIfNonExistent()) { diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java b/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java index 106dd71b83c..04b66480a82 100644 --- a/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java +++ b/vespaclient-container-plugin/src/test/java/com/yahoo/vespa/http/server/V3CongestionTestCase.java @@ -18,8 +18,8 @@ import com.yahoo.messagebus.shared.SharedMessageBus; import com.yahoo.messagebus.shared.SharedSourceSession; import com.yahoo.metrics.simple.MetricReceiver; import com.yahoo.vespa.http.client.core.Headers; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.MockFeedReaderFactory; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import org.junit.Before; import org.junit.Test; @@ -45,8 +45,7 @@ public class V3CongestionTestCase { ClientFeederWithMocks(ReferencedResource<SharedSourceSession> sourceSession, FeedReaderFactory feedReaderFactory, DocumentTypeManager docTypeManager, String clientId, Metric metric, ReplyHandler feedReplyHandler, AtomicInteger threadsAvailableForFeeding) { super(sourceSession, feedReaderFactory, docTypeManager, clientId, metric, feedReplyHandler, threadsAvailableForFeeding); // The operation to return from the client feeder. - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - docOp = DocumentOperationMessageV3.newRemoveMessage(op, "operation id"); + docOp = DocumentOperationMessageV3.newRemoveMessage(FeedOperation.INVALID, "operation id"); } diff --git a/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java b/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java index b399b1197da..eabbb2dab20 100644 --- a/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java +++ b/vespaclient-container-plugin/src/test/java/com/yahoo/vespaxmlparser/MockReader.java @@ -7,7 +7,6 @@ import com.yahoo.document.DocumentType; import com.yahoo.document.DocumentUpdate; import com.yahoo.vespa.http.server.MetaStream; import com.yahoo.vespa.http.server.util.ByteLimitedInputStream; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader.Operation; import java.io.InputStream; import java.lang.reflect.Field; @@ -45,9 +44,9 @@ public class MockReader implements FeedReader { } @Override - public void read(Operation operation) throws Exception { + public FeedOperation read() throws Exception { if (finished) { - return; + return FeedOperation.INVALID; } byte whatToDo = stream.getNextOperation(); @@ -55,19 +54,14 @@ public class MockReader implements FeedReader { DocumentType docType = new DocumentType("banana"); switch (whatToDo) { case 0: - finished = true; - break; + return FeedOperation.INVALID; case 1: - Document doc = new Document(docType, id); - operation.setDocument(doc); - break; + return new DocumentFeedOperation(new Document(docType, id)); case 2: - operation.setRemove(id); - break; + return new RemoveFeedOperation(id); case 3: - operation.setDocumentUpdate(new DocumentUpdate(docType, id)); - break; - case 4: + return new DocumentUpdateFeedOperation(new DocumentUpdate(docType, id)); + default: throw new RuntimeException("boom"); } } diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java index e354cba141d..19d074a0ead 100644 --- a/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java +++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/Feeder.java @@ -10,8 +10,8 @@ import java.util.List; import javax.xml.stream.XMLStreamException; import com.yahoo.document.DocumentTypeManager; +import com.yahoo.vespaxmlparser.FeedOperation; import com.yahoo.vespaxmlparser.FeedReader; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; /** * Base class for unpacking document operation streams and pushing to feed @@ -80,14 +80,13 @@ public abstract class Feeder { while (!sender.isAborted()) { try { - VespaXMLFeedReader.Operation op = new VespaXMLFeedReader.Operation(); - reader.read(op); + FeedOperation op = reader.read(); if (createIfNonExistent && op.getDocumentUpdate() != null) { op.getDocumentUpdate().setCreateIfNonExistent(true); } // Done feeding. - if (op.getType() == VespaXMLFeedReader.OperationType.INVALID) { + if (op.getType() == FeedOperation.Type.INVALID) { break; } else { sender.sendOperation(op); diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java index b441e81a829..a1666a83856 100755 --- a/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java +++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/VespaFeedSender.java @@ -1,7 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.feedapi; -import com.yahoo.vespaxmlparser.VespaXMLFeedReader; +import com.yahoo.vespaxmlparser.FeedOperation; /** * Wrapper class for SimpleFeedAccess to send various XML operations. @@ -18,7 +18,7 @@ public class VespaFeedSender { return sender.isAborted(); } - public void sendOperation(VespaXMLFeedReader.Operation op) { + public void sendOperation(FeedOperation op) { switch (op.getType()) { case DOCUMENT: sender.put(op.getDocument(), op.getCondition()); |