All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.ode.jacob.examples.eratosthenes.Sieve Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.ode.jacob.examples.eratosthenes;

import org.apache.ode.jacob.JacobRunnable;
import org.apache.ode.jacob.SynchChannel;
import org.apache.ode.jacob.SynchChannelListener;
import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
import org.apache.ode.jacob.vpu.JacobVPU;

/**
 * Sieve of Eratosthenes prime number generator.
 * This class represents the following process term:
 * 

 * Sieve :=
 *  (v integers)(v primes) Counter(integer,2) | Head(integer, primes) | Print(primes)
 * 
* *

Created on Feb 12, 2004 at 6:32:49 PM.

* * @author Maciej Szefler mbs */ public class Sieve extends JacobRunnable { private static final long serialVersionUID = -1303509567096202776L; private static int _cnt = 0; private static int _last = 0; public void run() { NaturalNumberStreamChannel integers = newChannel(NaturalNumberStreamChannel.class); NaturalNumberStreamChannel primes = newChannel(NaturalNumberStreamChannel.class); instance(new Counter(integers,2)); instance(new Head(integers,primes)); instance(new Print(primes)); } public class Foo {} /** * A counter, aka integer stream generator; represents the following process term: *

   *  Counter(out, n) := out.val(n) | Counter(out, n+1)
   * 
*/ private static class Counter extends JacobRunnable { private static final long serialVersionUID = 4739323750438991003L; private NaturalNumberStreamChannel _out; private int _n; public Counter(NaturalNumberStreamChannel out, int n) { _out = out; _n = n; } public void run() { _out.val(_n, object(new SynchChannelListener(newChannel(SynchChannel.class)) { private static final long serialVersionUID = -4336285925619915276L; public void ret() { instance(new Counter(_out, _n+1)); } })); } } /** * Head extractor, takes the first element from a stream; this represent the process * term: *

   * Head(in, primes) :=
   *  in ? [val(n)={primes.val(n) | (v x) PrimeFilter(n, in, x) | Head(x,primes)}]
   * 
* * */ private static final class Head extends JacobRunnable { private static final long serialVersionUID = 1791641314141082728L; NaturalNumberStreamChannel _in; NaturalNumberStreamChannel _primes; public Head(NaturalNumberStreamChannel in, NaturalNumberStreamChannel primes) { _in = in; _primes = primes; } public void run() { object(new NaturalNumberStreamChannelListener(_in) { private static final long serialVersionUID = -2145752474431263689L; public void val(final int n, final SynchChannel ret) { _primes.val(n, object(new SynchChannelListener(newChannel(SynchChannel.class)) { private static final long serialVersionUID = -3009595654233593893L; public void ret() { NaturalNumberStreamChannel x = newChannel(NaturalNumberStreamChannel.class); instance(new PrimeFilter(n, _in, x)); instance(new Head(x, _primes)); ret.ret(); } })); } }); } } private static final class Print extends JacobRunnable { private static final long serialVersionUID = -3134193737519487672L; private NaturalNumberStreamChannel _in; public Print(NaturalNumberStreamChannel in) { _in = in; } public void run() { object(true, new NaturalNumberStreamChannelListener(_in){ private static final long serialVersionUID = 7671019806323866866L; public void val(int n, SynchChannel ret) { _cnt ++; _last = n; System.out.println("PRIME: " + n); ret.ret(); } }); } } /** * A prime filter, filters out the nubmer in an input stream that are multiple of a * prime. This represents the following process term: *

   * PrimeFilter(prime, in, out) :=
   *     ! in ? [val(n)={ if(n mod prime <> 0) out.val(n) }
   * 
   */
  private static class PrimeFilter extends JacobRunnable {
    private static final long serialVersionUID = 1569523200422202448L;

    private int _prime;
    private NaturalNumberStreamChannel _in;
    private NaturalNumberStreamChannel _out;

    public PrimeFilter(int prime, NaturalNumberStreamChannel in, NaturalNumberStreamChannel out) {
      _prime = prime;
      _in = in;
      _out = out;
    }
    public void run() {
       object(true, new NaturalNumberStreamChannelListener(_in) {
        private static final long serialVersionUID = 6625386475773075604L;

        public void val(int n, final SynchChannel ret) {
           if (n % _prime != 0)
             _out.val(n, object(new SynchChannelListener(newChannel(SynchChannel.class)) {
              private static final long serialVersionUID = 2523405590764193613L;

              public void ret() {
                 ret.ret();
               }
             }));
           else
             ret.ret();
         }
       });
    }
  }


  public static void main(String args[]) {
    if (args.length != 1) {
      System.err.println("JACOB Sieve of Eratosthenes Prime Number Generator Demonstration");
      System.err.println("usage: java " + Sieve.class.getName() + " requested-prime");
      System.err.println("  requested-prime = which prime to show (0->inf)");
      System.exit(1);
    } else {
      int request = Integer.parseInt(args[0]);
      JacobVPU vpu = new JacobVPU();
      vpu.setContext(new ExecutionQueueImpl(null));
      vpu.inject(new Sieve());
      while (_cnt != request) {
        vpu.execute();
      }
      System.err.println("The " + _cnt + "th prime is " + _last);
    }


  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy