[ https://issues.apache.org/jira/browse/TINKERPOP-960?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
stephen mallette updated TINKERPOP-960: --------------------------------------- Fix Version/s: (was: 3.2.5) 3.2.6 > Add a Bulk class which is used by Traverser > ------------------------------------------- > > Key: TINKERPOP-960 > URL: https://issues.apache.org/jira/browse/TINKERPOP-960 > Project: TinkerPop > Issue Type: Improvement > Components: process > Affects Versions: 3.1.0-incubating > Reporter: Marko A. Rodriguez > Assignee: Marko A. Rodriguez > Labels: breaking > Fix For: 3.2.6 > > > Currently, {{Traverser.bulk()}} is a {{long}}. This should be generalized to > support any type of "bulk" that can be split, merged, and has a magnitude, > where our current representation would be a {{LongBulk}}. > There are three reasons to support this. > 1. Right now we use {{Traverser.sack()}} to handle "energy flows" (0/0 to 1.0 > energy in a traverser). We have introduced this ugly > {{TraversalSource.withBulk(false)}} to allow these to semantically make sense > (i.e. remain unitary). The "energy" should be the "bulk" as it can be split, > merged, and has a magnitude. > 2. We can support complex numbers for bulks (and complex number arrays). > There is currently no strong use case for this beyond quantum simulation and > wave dynamics, but you never know what might unfold. A solid algorithm here > would be epic. > 3. We need to be able to support {{BigInteger}} as the bulking model on > complex graphs easily blows {{long}}. There have been numerous times where I > wanted to {{repeat()}} more times, but can't without incurring long overflow > and thus, negative bulk. If the computation calls for it, a user should be > able to use {{BigInteger}}. > -------------------------- > {code} > public interface Bulk<T> { > public boolean canMerge(Bulk<T> otherBulk); > public void merge(Bulk<T> otherBulk); > public Bulk<T> split(); > public Number magnitude(); > public T get(); > public boolean isAlive(); > public static Bulk<T> identity(); > } > {code} > Our current model would be: > {code} > public class LongBulk extends Bulk<Long> { > public boolean canMerge(LongBulk otherBulk) { return true; } > public void merge(LongBulk otherBulk) { this.count += otherBulk.count; } > public LongBulk split() { return new LongBulk(this.count); } > public Number magnitude() { return this.count; } > public Long get() { return this.count; } > public boolean isAlive() { return this.count > 0; } > public static LongBulk identity() { return new LongBulk(1); } > } > {code} > Another benefit of this is that bulking is now decoupled from the > {{Traverser}} class and thus, you would be able to use different bulk classes > with the same {{Traverser}}-species: > {code} > g.withBulk(BigIntegerBulk.class).V().out().out() > {code} > ...where the default is assumed {{LongBulk}} and thus, you don't have to > specify a {{withBulk}}. For backwards compatible sake, {{withBulk(false)}} > would simply be {{IdentityLongBulk}} would would just return a {{1}} for > everything. > We will want to then expose {{it.bulk()}} methods so algorithms can alter the > bulk as they see fit. However, this is where a backwards compatibility issue > would happen. {{Traverser.bulk() -> Bulk}} and {{Traverser.magnitude() -> > Number}} (sidenote ---- perhaps "magnitude" is just called "count"). > {code} > g.withBulk(UnitaryBulk).V(0).bulk(1.0).outE().bulk(mult).by('weight').inV() > {code} > What is stellar about this is that it frees up "sack" for more "objects" and > not for "bulking" when long is not sufficient. Thus, we promote that "sack" > is for objects and "bulk" is for, well, bulk! Now we no longer have this > weird tension between bulk and sack as they have two different uses. Bulking > is for altering the "magnitude" of a traverser and sacking if for gathering > statistics/data about the graph along the way. -- This message was sent by Atlassian JIRA (v6.4.14#64029)