Example implemented from "The computer Language Benchmarks Game" - Mandelbrot

http://benchmarksgame.alioth.debian.org/

Complete description of mandelbrot : https://benchmarksgame.alioth.debian.org/u64q/mandelbrot-description.html#mandelbrot

Introduced classes

Redefined classes

redef class Sys

actors :: mandelbrot $ Sys

The main class of the program.

All class definitions

redef class Sys

actors :: mandelbrot $ Sys

The main class of the program.
class Worker

actors $ Worker

package_diagram actors::mandelbrot mandelbrot actors actors actors::mandelbrot->actors pthreads pthreads actors->pthreads ...pthreads ... ...pthreads->pthreads a_star-m a_star-m a_star-m->actors::mandelbrot

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module array

core :: array

This module introduces the standard array structure.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module concurrent_collections

pthreads :: concurrent_collections

Introduces thread-safe concurrent collections
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module extra

pthreads :: extra

Offers some POSIX threads services that are not available on all platforms
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module native

core :: native

Native structures for text and bytes
module numeric

core :: numeric

Advanced services for Numeric types
module protocol

core :: protocol

module pthreads

pthreads :: pthreads

Main POSIX threads support and intro the classes Thread, Mutex and Barrier
module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O

Parents

module actors

actors :: actors

Abstraction of the actors concepts

Children

module a_star-m

a_star-m

# Example implemented from "The computer Language Benchmarks Game" - Mandelbrot
# http://benchmarksgame.alioth.debian.org/
#
# Complete description of mandelbrot :
# https://benchmarksgame.alioth.debian.org/u64q/mandelbrot-description.html#mandelbrot
module mandelbrot is example, no_warning("missing-doc")

import actors

class Worker
	actor

	fun get_byte(x, y: Int): Int do
		var res = 0
		for i in [0..8[.step(2) do
			var zr1 = crb[x + i]
			var zi1 = cib[y]

			var zr2 = crb [x + i + 1]
			var zi2 = cib[y]

			var b = 0
			for j in [0..nb_rounds[ do
				var nzr1 = zr1 * zr1 - zi1 * zi1 + crb[x+i]
				var nzi1 = zr1 * zi1 + zr1 * zi1 + cib[y]
				zr1 = nzr1
				zi1 = nzi1

				var nzr2 = zr2 * zr2 - zi2 * zi2 + crb[x + i + 1]
				var nzi2 = zr2 * zi2 + zr2 * zi2 + cib[y]
				zr2 = nzr2
				zi2 = nzi2

				if zr1 * zr1 + zi1 * zi1 > 4.0 then b = b | 2
				if zr2 * zr2 + zi2 * zi2 > 4.0 then b = b | 1
				if b == 3 then break
			end
			res = (res << 2) + b
		end
		return res ^-1
	end

	fun put_line(y: Int, line: Array[Int]) do
		for i in [0..line.length[ do line[i] = get_byte(i * 8, y)
	end

	fun work do
		var line = 0
		loop
			line = atomic.get_and_increment
			if line < n then put_line(line, data[line]) else break
		end
	end
end

redef class Sys
	var n = 0
	var inv_n: Float is noautoinit
	var data: Array[Array[Int]] is noautoinit
	var crb: Array[Float] is noautoinit
	var cib: Array[Float] is noautoinit
	var atomic = new AtomicInt(0)
	var nb_threads = 8
	# How many time do we iterate before deciding if the number
	# is in the mandelbrot set or not
	var nb_rounds  = 49
end

n = if args.is_empty then 200 else args[0].to_i

sys.crb = new Array[Float].with_capacity(n)
sys.cib = new Array[Float].with_capacity(n)
sys.inv_n = 2.0 / n.to_f
for i in [0..n[ do
	sys.cib[i] = i.to_f * inv_n - 1.0
	sys.crb[i] = i.to_f * inv_n - 1.5
end
sys.data = new Array[Array[Int]].with_capacity(n)
for i in [0..n[ do sys.data[i] = new Array[Int].filled_with(0, (n) / 8)

# Parallel Approach
var actors = new Array[Worker]
for i in [0..nb_threads[ do
	var a = new Worker
	actors.add(a)
	a.async.work
end

for a in actors do
	a.async.terminate
	a.async.wait_termination
end

var filename = "WRITE".environ
if filename == "" then filename = "out"
var output = new FileWriter.open(filename)
output.write_bytes("P4\n{n} {n}\n".to_bytes)
for i in [0..n[ do
	var length = data[i].length
	for j in [0..length[ do output.write_byte(data[i][j])
end
output.close
lib/actors/examples/mandelbrot/mandelbrot.nit:15,1--116,12