DISPEL Tutorial Paul Martin VERCE Training Programme 3rd September - - PowerPoint PPT Presentation

dispel tutorial
SMART_READER_LITE
LIVE PREVIEW

DISPEL Tutorial Paul Martin VERCE Training Programme 3rd September - - PowerPoint PPT Presentation

Virtual Earthquake and seismology Research Community e-science environment in Europe Project 283543 FP7-INFRASTRUCTURES-2011-2 www.verce.eu info@verce.eu DISPEL Tutorial Paul Martin VERCE Training Programme 3rd September 2012


slide-1
SLIDE 1

Virtual Earthquake and seismology Research Community e-science environment in Europe Project 283543 – FP7-INFRASTRUCTURES-2011-2 – www.verce.eu – info@verce.eu

DISPEL Tutorial

Paul Martin

VERCE Training Programme

3rd September 2012

www.verce.eu

slide-2
SLIDE 2

Workflow enactment

Compute Cluster User Machine

DISPEL Tutorial 3rd September 2012 2 / 30

slide-3
SLIDE 3

Workflow enactment

VERCE Gateway / Portal ADMIRE Gateway Data Store Enactment Engine Component Registry Component Repository

DISPEL Tutorial 3rd September 2012 2 / 30

slide-4
SLIDE 4

Workflow enactment

User Request Dispel Request

DISPEL Tutorial 3rd September 2012 2 / 30

slide-5
SLIDE 5

Workflow enactment

Delegation / Registry Lookup

DISPEL Tutorial 3rd September 2012 2 / 30

slide-6
SLIDE 6

Workflow enactment

Instruction

DISPEL Tutorial 3rd September 2012 2 / 30

slide-7
SLIDE 7

Workflow enactment

Data Request / Submission / Signalling

DISPEL Tutorial 3rd September 2012 2 / 30

slide-8
SLIDE 8

Workflow enactment

Result Notification

DISPEL Tutorial 3rd September 2012 2 / 30

slide-9
SLIDE 9

An example workflow

DISPEL Tutorial 3rd September 2012 3 / 30

slide-10
SLIDE 10

A simple script

1

// Import PEs from the local registry.

2

use dispel.db.SQLQuery;

3

use dispel.lang.Results;

4 5

// Create instances of PEs.

6

SQLQuery query = new SQLQuery;

7

Results results = new Results;

8 9

// Construct workflow and feed in data.

10

|-"SELECT * FROM littleblackbook WHERE id < 10"-| => query.expression;

11

|-"uk.org.UoE.dbA"-| => query.resource;

12

|-"10 entries from the little black book"-| => results.name;

13

query.data => results.input;

14 15

// Submit the entire workflow.

16

submit;

DISPEL Tutorial 3rd September 2012 4 / 30

slide-11
SLIDE 11

Demonstrating stream literals

1

// Import PEs from the local registry.

2

use dispel.db.SQLQuery;

3 4

// Create instances of PEs.

5

SQLQuery query = new SQLQuery;

6

Results results = new Results;

7 8

// Define a set of queries.

9

String[] queries = new String[2];

10

queries[0] = "SELECT name FROM littleblackbook WHERE id < 10";

11

queries[1] = "SELECT name FROM littleblackbook WHERE id >= 10 AND id < 20";

12

queries[2] = "SELECT address FROM littleblackbook WHERE name = ’David Hume’";

13 14

// Construct workflow and feed in data.

15

|-queries[0], queries[1], queries[2]-| => query.expression;

16

|-"uk.org.UoE.dbA", "uk.org.UoE.dbB", "uk.org.UoE.dbC"-| => query.resource;

17

|-"Results from the little black book"-| => results.name;

18

query.data => results.input;

19 20

// Submit the entire workflow.

21

submit;

DISPEL Tutorial 3rd September 2012 5 / 30

slide-12
SLIDE 12

Demonstrating stream literals

1

// Import PEs from the local registry.

2

use dispel.db.SQLQuery;

3 4

// Create instances of PEs.

5

SQLQuery query = new SQLQuery;

6

Results results = new Results;

7 8

// Define a set of queries.

9

String[] queries = new String[2];

10

queries[0] = "SELECT name FROM littleblackbook WHERE id < 10";

11

queries[1] = "SELECT name FROM littleblackbook WHERE id >= 10 AND id < 20";

12

queries[2] = "SELECT address FROM littleblackbook WHERE name = ’David Hume’";

13 14

// Construct workflow and feed in data.

15

|-queries[0], queries[1], queries[2]-| => query.expression;

16

|-repeat 3 of "uk.org.UoE.dbA"-| => query.resource;

17

|-"Results from the little black book"-| => results.name;

18

query.data => results.input;

19 20

// Submit the entire workflow.

21

submit;

DISPEL Tutorial 3rd September 2012 6 / 30

slide-13
SLIDE 13

A precocious script

1

// Import PEs from the local registry.

2

use dispel.db.SQLQuery;

3

use dispel.tutorial.PrecociousChild;

4 5

// Create instances of PEs.

6

PrecociousChild child = new PrecociousChild;

7

SQLQuery query = new SQLQuery;

8

Results results = new Results;

9 10

// Construct workflow and feed in data.

11

child.output => query.expression;

12

|-repeat enough of "uk.org.UoE.dbA"-| => query.resource;

13

|-"Adult responses"-| => results.name;

14

query.data => results.input;

15 16

// Submit the entire workflow.

17

submit;

DISPEL Tutorial 3rd September 2012 7 / 30

slide-14
SLIDE 14

PE Specification

1

// Within the Dispel database package.

2

package dispel.db {

3

// Link to database ontology.

4

namespace db "http://www.dispel-lang.org/resource/db";

5

// Type signature for the SQLQuery PE.

6

Type SQLQuery is PE( <Connection:String::"db:SQLQuery" terminator expression; Connection:String::"db:URI" locator resource> =>

7

<Connection:[<rest>]::"db:TupleRowSet" data> );

8

// Register the PE.

9

register SQLQuery;

10

}

11 12

// Within the package of generically useful PEs.

13

package dispel.core {

14

// A generic interpolation PE with few restrictions.

15

Type Interpolate is PE( Stype Element is Any; <Connection[]:Element inputs> => <Connection:Element output> );

16

// This PE evenly interpolates in order of input connections.

17

Type OrderedInterpolate is Interpolate

18

with roundrobin inputs, @description = "Interpolates evenly by order of inputs.";

19 20

register Interpolate, OrderedInterpolate;

21

}

22 23

// Within the Dispel filter package.

24

package dispel.filter {

25

Type AbstractFilter is PE( Stype Element is Any;

26

<Connection:Element inputs> => <Connection:Element filtered; Connection:Element unfiltered> )

27

with @description = "A filter splits input into filtered and unfiltered streams.";

28 29

Type HeadFilter is AbstractFilter

30

with filtered as head, unfiltered as tail, @description = "Diverts the head of a stream.";

31 32

Type ProgrammableIntegerFilter is PE( <Connection:Integer terminator input; Connection:String initiator expression;

33

Connection[]:Integer lockstep parameters> =>

34

<Connection:Integer filtered; Connection:Integer unfiltered> )

35

with @description = "Splits the input integer stream into ’filtered’ and ’unfiltered’ streams in" +

36

"accordance with the expression and parameters given.";

37 38

register AbstractFilter, HeadFilter, ProgrammableIntegerFilter;

39

}

40

DISPEL Tutorial 3rd September 2012 8 / 30

slide-15
SLIDE 15

Constructing new PEs

1

package tutorial.example {

2

// Import existing PE from the registry.

3

use dispel.db.SQLQuery;

4 5

// Define new PE type.

6

Type SQLToTupleList is PE( <Connection expression> => <Connection data> );

7 8

// Define new PE constructor.

9

PE<SQLToTupleList> lockSQLDataSource(String dataSource) {

10

SQLQuery query = new SQLQuery;

11

|-repeat enough of dataSource-| => query.resource;

12

return PE( <Connection expression = query.expression> =>

13

<Connection data = query.data> );

14

}

15 16

// Create new PEs.

17

PE<SQLToTupleList> TutorialQuery = lockSQLDataSource("uk.org.UoE.dbA");

18

PE<SQLToTupleList> MirrorQuery = lockSQLDataSource("uk.org.UoE.dbB");

19 20

// Register new entities.

21

register TutorialQuery, MirrorQuery;

22

}

DISPEL Tutorial 3rd September 2012 9 / 30

slide-16
SLIDE 16

Using the new PE

1

// Import PEs from the local registry.

2

use tutorial.example.TutorialQuery;

3 4

// Create instances of PEs (no import necessary).

5

TutorialQuery query = new TutorialQuery;

6

Results results = new Results;

7 8

// Connect PEI together to create workflow (no data source needed).

9

|-"SELECT * FROM littleblackbook WHERE id <= 10"-| => query.expression;

10

|-"10 entries from the little black book"-| => results.name;

11

query.data => results.input;

12 13

// Submit workflow.

14

submit results;

DISPEL Tutorial 3rd September 2012 10 / 30

slide-17
SLIDE 17

Multicasting with composite PEs

MulticastQuery Query Generator "uk.org.UoE.dbA" "uk.org.UoE.dbB" "uk.org.UoE.dbC" Results

DISPEL Tutorial 3rd September 2012 11 / 30

slide-18
SLIDE 18

Multicasting with composite PEs

Query Generator "uk.org.UoE.dbA" "uk.org.UoE.dbB" "uk.org.UoE.dbC" SQLQuery SQLQuery SQLQuery List Intersect Results

DISPEL Tutorial 3rd September 2012 12 / 30

slide-19
SLIDE 19

A PE constructor featuring iteration

1

package tutorial.example {

2

use dispel.db.SQLQuery;

3

use dispel.list.ListIntersect;

4 5

// A PE type which queries multiple sources.

6

Type MulticastQuery is PE( <Connection expression; Connection[] sources> => <Connection data> );

7 8

// Use parallel SQLQuery instances to corroborate results.

9

PE<MulticastQuery> makeCorroboratedSQLQuery(Integer size) {

10

// Define aliases for workflow inputs in advance.

11

Connection expr;

12

Connection[] srcs = new Connection[size];

13

// Create instances of internal PEs.

14

SQLQuery[] queries = new SQLQuery[size];

15

ListIntersect intersect = new ListIntersect with inputs.length = size;

16 17

// Connect SQLQuery instances in parallel.

18

for (Integer i = 0; i < size; i++) {

19

queries[i] = new SQLQuery;

20

expr => queries[i].expression;

21

srcs[i] => queries[i].resource;

22

queries[i].data => intersect.inputs[i];

23

}

24 25

// Return intersection of query results.

26

return PE( <Connection expression = expr; Connection[] sources = srcs> =>

27

<Connection data = intersect.output> );

28

}

29 30

register MulticastQuery, makeCorroboratedSQLQuery;

31

}

DISPEL Tutorial 3rd September 2012 13 / 30

slide-20
SLIDE 20

Multicasting with composite PEs

Query Generator "uk.org.UoE.dbA" "uk.org.UoE.dbB" "uk.org.UoE.dbC" SQLQuery SQLQuery SQLQuery List Merge Results Query Generator "uk.org.UoE.dbD" "uk.org.UoE.dbE" "uk.org.UoE.dbF" SQLQuery SQLQuery SQLQuery List Union Results DISPEL Tutorial 3rd September 2012 14 / 30

slide-21
SLIDE 21

A PE constructor featuring selection

1

package tutorial.example {

2

use dispel.db.SQLQuery;

3

use dispel.list.Combiner;

4

use dispel.list.ListUnion;

5

use dispel.list.ListMerge;

6

// Import abstract type defined earlier.

7

use tutorial.example.MulticastQuery;

8 9

// Use parallel SQLQuery instances to collect results.

10

PE<MulticastQuery> makeMassSQLQuery(Integer size, Boolean unique) {

11

// Prepare components for connection.

12

Connection expr;

13

Connection[] srcs = new Connection[size];

14

SQLQuery[] queries = new SQLQuery[size];

15

Combiner merge;

16

// Select combiner based on uniqueness condition.

17

if (unique) merge = new ListUnion with inputs.length = size;

18

else merge = new ListMerge with inputs.length = size;

19 20

// Connect SQLQuery instances in parallel.

21

for (Integer i = 0; i < size; i++) {

22

queries[i] = new SQLQuery;

23

expr => queries[i].expression;

24

srcs[i] => queries[i].resource;

25

queries[i].data => merge.inputs[i];

26

}

27 28

// Return merger of query results.

29

return PE( <Connection expression = expr; Connection[] sources = srcs> =>

30

<Connection data = merge.output> );

31

}

32 33

register makeMassSQLQuery;

34

}

35

DISPEL Tutorial 3rd September 2012 15 / 30

slide-22
SLIDE 22

k-fold cross validation

Data Validator Data Producer Results

DISPEL Tutorial 3rd September 2012 16 / 30

slide-23
SLIDE 23

k-fold cross validation

1

package dispel.datamine {

2

use dispel.core.DataPartition;

3

use dispel.list.ListMerge;

4 5

// Produces a k-fold cross validation workflow pattern.

6

PE<Validator> makeCrossValidator(Integer k, PE<TrainClassifier> Train,

7

PE<ApplyClassifier> Classify, PE<ModelEvaluate> Evaluate) {

8

Connection input;

9

// Data must be partitioned and re-combined for each fold.

10

PE<DataPartitioner> FoldData = makeDataFold(k);

11

FoldData fold = new FoldData;

12

ListMerge union = new ListMerge with inputs.length = k;

13 14

// For each fold, train a classifier then evaluate it.

15

input => fold.data;

16

for (Integer i = 0; i < k; i++) {

17

Train train = new Train;

18

Classify classify = new Classify;

19

Evaluate evaluate = new Evaluate;

20 21

fold.training[i] => train.data;

22

train.classifier => classify.classifier;

23

fold.test[i] => classify.data;

24

classify.result => evaluate.predicted;

25

fold.test[i] => evaluate.expected;

26

evaluate.score => union.inputs[i];

27

}

28 29

// Return cross validation pattern.

30

return PE( <Connection data = input> => <Connection results = union.output> );

31

}

32 33

register makeCrossValidator;

34

}

DISPEL Tutorial 3rd September 2012 17 / 30

slide-24
SLIDE 24

k-fold cross validation

Data Partitioner Train Classifier Apply Classifier Model Evaluator Train Classifier Train Classifier Apply Classifier Apply Classifier Model Evaluator Model Evaluator ListMerge Data Producer Results

DISPEL Tutorial 3rd September 2012 18 / 30

slide-25
SLIDE 25

k-fold cross validation

1

package dispel.datamine {

2

use dispel.core.RandomListSplit;

3

use dispel.list.ListMerge;

4 5

// Produces a PE capable of splitting data for k-fold cross validation.

6

PE<DataPartitioner> makeDataFold(Integer k) {

7

Connection input;

8

Connection[] trainingData = new Connection[k];

9

Connection[] testData = new Connection[k];

10

// Create instance of PEs for randomly splitting and recombining data.

11

RandomListSplit sample = new RandomListSplit with results.length = k;

12

ListMerge[] union = new ListMerge[k];

13 14

// After partitioning data, form training and test sets.

15

input => sample.input;

16

for (Integer i = 0; i < k; i++) {

17

union[i] = new TupleUnionAll with inputs.length = k - 1;

18

for (Integer j = 0; j < i; j++) sample.outputs[j] => union[i].inputs[j];

19

sample.outputs[i] => testData[i];

20

for (Integer j = i + 1; j < k; j++) sample.outputs[j] => union[i].inputs[j - 1];

21

union[i].output => trainingData[i];

22

}

23 24

// Return data folding pattern.

25

return PE( <Connection data = input> =>

26

<Connection[] training = trainingData; Connection[] test = testData> );

27

}

28 29

register makeDataFold;

30

}

DISPEL Tutorial 3rd September 2012 19 / 30

slide-26
SLIDE 26

k-fold cross validation

ListMerge ListMerge ListMerge Random ListSplit Train Classifier Apply Classifier Model Evaluator Train Classifier Train Classifier Apply Classifier Apply Classifier Model Evaluator Model Evaluator ListMerge Data Producer Results

DISPEL Tutorial 3rd September 2012 20 / 30

slide-27
SLIDE 27

k-fold cross validation

1

package dispel.datamine {

2

// Import test PEs.

3

use dispel.tutorial.DataProducer;

4

use dispel.tutorial.TrainingAlgorithmA;

5

use dispel.tutorial.BasicClassifier;

6

use dispel.tutorial.MeanEvaluator;

7 8

// Create a cross validator PE.

9

PE<Validator> CrossValidator

10

= makeCrossValidator(12, TrainingAlgorithmA, BasicClassifier, MeanEvaluator);

11

// Make instances of PEs for workflows.

12

DataProducer producer = new DataProducer;

13

CrossValidator validator = new CrossValidator;

14

Results results = new Results;

15 16

// Connect workflow.

17

|- "uk.org.UoE.data.corpus11" -| => producer.source;

18

producer.data => validator.data;

19

validator.results => results.input;

20

|- "Classifier Scores" -| => results.name;

21 22

submit;

23

}

DISPEL Tutorial 3rd September 2012 21 / 30

slide-28
SLIDE 28

k-fold cross validation

expression resource queryTest uk.org.ogsadai.SQLQuery data expression data uk.org.ogsadai.TupleArithmeticSample result[0] result[2] result[1] result[3] MySQLResource select outlook, temp... result name input results eu.admire.Results select outlook, temp... expression resource queryTrain uk.org.ogsadai.SQLQuery data MySQLResource columnIds aggregates data resultColumnNames uk.org.ogsadai.GroupBy result data[0] data[2] data[1] data[3] uk.org.ogsadai.TupleUnionAll data play nominalValues columnIndices data classIndex eu.admire.BuildClassifier classifier [, [, sunny, rainy, overcast, ], [, true, false, ], [, yes, no, ], ] nominalValues columnIndices data classIndex eu.admire.BuildClassifier classifier [, expected, actual, count, ] columnIds aggregates data resultColumnNames uk.org.ogsadai.GroupBy result play [, [, sunny, rainy, overcast, ], [, true, false, ], [, yes, no, ], ] columnIds aggregates data resultColumnNames uk.org.ogsadai.GroupBy result data[0] data[1] uk.org.ogsadai.TupleSimpleMerge result [, expected, actual, count, ] predicted resultColumnName classifier data eu.admire.datamine.Classify result [, COUNT(*), ] predicted resultColumnName classifier data eu.admire.datamine.Classify result [, SUM(count), ] columnIds aggregates data resultColumnNames uk.org.ogsadai.GroupBy result resultColumnName classifier data eu.admire.datamine.Classify result [, expected, actual, ] data[0] data[1] uk.org.ogsadai.TupleSimpleMerge result [, expected, actual, count, ] [, play, predicted, ] data[0] data[2] data[1] uk.org.ogsadai.TupleUnionAll data nominalValues columnIndices data classIndex eu.admire.BuildClassifier classifier [, outlook, windy, play, ] [, COUNT(*), ] data[0] data[1] uk.org.ogsadai.TupleSimpleMerge result columnIds aggregates data resultColumnNames uk.org.ogsadai.GroupBy result [, [, sunny, rainy, overcast, ], [, true, false, ], [, yes, no, ], ] nominalValues columnIndices data classIndex eu.admire.BuildClassifier classifier data[0] data[2] data[1] uk.org.ogsadai.TupleUnionAll data data[0] data[1] uk.org.ogsadai.TupleSimpleMerge result resultColumnName classifier data eu.admire.datamine.Classify result play Floor(Rand(54783) * ... [, play, predicted, ] data[0] data[2] data[1] uk.org.ogsadai.TupleUnionAll data [, outlook, windy, play, ] [, outlook, windy, play, ] [, expected, actual, count, ] [, [, sunny, rainy, overcast, ], [, true, false, ], [, yes, no, ], ] [, COUNT(*), ] play Floor(Rand(54783) * ... expression data uk.org.ogsadai.TupleArithmeticSample result[0] result[2] result[1] result[3] [, play, predicted, ] [, play, predicted, ] data[0] data[2] data[1] uk.org.ogsadai.TupleUnionAll data predicted [, expected, actual, count, ] [, outlook, windy, play, ] predicted [, COUNT(*), ]

DISPEL Tutorial 3rd September 2012 22 / 30

slide-29
SLIDE 29

Sieve of Eratosthenes

Prime Generator

DISPEL Tutorial 3rd September 2012 23 / 30

slide-30
SLIDE 30

Sieve of Eratosthenes

DISPEL Tutorial 3rd September 2012 24 / 30

slide-31
SLIDE 31

Sieve of Eratosthenes

1

package tutorial.example {

2

use dispel.filter.AbstractFilter;

3

use dispel.filter.HeadFilter;

4

use dispel.filter.ProgrammableIntegerFilter;

5 6

// Define sieve element constructor.

7

PE<AbstractFilter> makeSieveFilter() {

8

// Create reference to input connection.

9

Connection:Integer input;

10

// Instantiate internal components.

11

HeadFilter split = new HeadFilter;

12

ProgrammableIntegerFilter divide = new ProgrammableIntegerFilter with parameters.length = 1;

13 14

// Construct internal workflow.

15

|-"x if (x % $0) == 0"-| => divide.expression;

16

input => split.input;

17

split.head => divide.parameter[0];

18

split.tail => divide.input;

19

divide.unfiltered => discard;

20 21

// Output first integer received and all indivisible integers.

22

return PE( <Connection input = input> =>

23

<Connection filtered = split.head; Connection unfiltered = divide.filtered> );

24

}

25 26

// Create the sieve element PE.

27

PE<AbstractFilter> SieveFilter = makeSieveFilter();

28 29

register SieveFilter;

30

}

31

DISPEL Tutorial 3rd September 2012 25 / 30

slide-32
SLIDE 32

Sieve of Eratosthenes

1

package tutorial.example {

2

use dispel.core.Interpolate;

3

use tutorial.example.SieveFilter;

4

use dispel.math.PrimeGenerator;

5 6

// Define sieve constructor.

7

PE<PrimeGenerator> makeSieveOfEratosthenes(Integer count) {

8

// Instantiate internal components.

9

SieveFilter filter = new SieveFilter[count];

10

Interpolate interpolate = new Interpolate with roundrobin inputs, input.length = count;

11 12

// Initialise sieve elements.

13

for (Integer i = 0; i < count - 1; i++) filter[i] = new SieveFilter with terminator output;

14

filter[count - 1] = new SieveFilter with terminator prime;

15 16

// Construct internal workflow.

17

|-x for x in 2..-| => filter[0].input;

18

for (Integer i = 0; i < count - 1; i++) {

19

filter[i].unfiltered => filter[i + 1].input;

20

filter[i].filtered => interpolate.inputs[i];

21

}

22

filter[count - 1].unfiltered => discard;

23

filter[count - 1].filtered => interpolate.input[count - 1];

24

filter[count - 1].filtered => stop;

25 26

// Return all primes generated.

27

return PE( <> => <Connection primes = interpolate.output> );

28

}

29 30

register makeSieveOfEratosthenes;

31

}

DISPEL Tutorial 3rd September 2012 26 / 30

slide-33
SLIDE 33

Sieve of Eratosthenes

1

package tutorial.example {

2

// Import abstract PE type and constructor.

3

use dispel.math.PrimeGenerator;

4 5

// Construct the sieve.

6

PE <PrimeGenerator> SoE100 = makeSieveOfEratosthenes(100);

7

SoE100 sieve100 = new SoE100;

8

Results results = new Results;

9 10

// Construct the top-level workflow.

11

|-"100 prime numbers"-| => results.name;

12

sieve100.primes => results.input;

13 14

// Submit the workflow.

15

submit;

16

}

DISPEL Tutorial 3rd September 2012 27 / 30

slide-34
SLIDE 34

Sieve of Eratosthenes

name input results eu.admire.Results The first 5 prime nu... input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor input[0] input[2] input[1] input[3] input[4] eu.admire.math.Combiner

  • utput

input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder eu.admire.math.NumberGenerator

  • utput

input eu.admire.math.DivisionFilter divisor remainder

DISPEL Tutorial 3rd September 2012 28 / 30

slide-35
SLIDE 35

Sieve of Eratosthenes

name input results eu.admire.Results The first 100 prime ... input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input[12] input[6] input[13] input[19] input[5] input[18] input[0] input[7] input[8] input[17] input[2] input[9] input[10] input[16] input[1] input[15] input[14] input[3] input[11] input[4] eu.admire.math.Combiner

  • utput

input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder eu.admire.math.NumberGenerator

  • utput

DISPEL Tutorial 3rd September 2012 29 / 30

slide-36
SLIDE 36

Sieve of Eratosthenes

The first 100 prime ... name input results eu.admire.Results input eu.admire.math.DivisionFilter divisor input[40] input[22] input[95] input[67] input[49] input[12] input[31] input[20] input[6] input[75] input[27] input[55] input[96] input[89] input[68] input[62] input[19] input[34] input[83] input[13] input[41] input[48] input[5] input[28] input[69] input[33] input[97] input[18] input[61] input[88] input[74] input[42] input[25] input[47] input[56] input[84] input[70] input[7] input[91] input[81] input[0] input[46] input[98] input[73] input[53] input[90] input[99] input[26] input[36] input[8] input[45] input[35] input[63] input[72] input[54] input[82] input[17] input[2] input[9] input[51] input[86] input[44] input[37] input[58] input[64] input[92] input[16] input[71] input[10] input[52] input[78] input[43] input[30] input[23] input[15] input[38] input[85] input[29] input[1] input[80] input[57] input[65] input[24] input[79] input[93] input[14] input[21] input[60] input[77] input[3] input[94] input[66] input[32] input[39] input[11] input[4] input[50] input[87] input[59] input[76] eu.admire.math.Combiner
  • utput
input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder eu.admire.math.NumberGenerator
  • utput
input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder input eu.admire.math.DivisionFilter divisor remainder

DISPEL Tutorial 3rd September 2012 30 / 30