[ 
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)

Reply via email to