node-petri
===========
a multi-agent system for Node
Description
For now this is mostly wrapper around Node Cluster, with some syntactic sugar
Usage
(Illustration example - code not tested)
Master (code controlling the pool, how agents are created)
require 'petri' commonlog = consolelog Petri -> log "Initializing" # start 2 processes for _ in 0...2 # module can be either a module name, or a module instance # module = require './my/program' module = './my/program' log "spawning agent.." worker = @spawn modulehello: 'world' workeron 'exit'-> log "agent died" @on 'data' switch msgcmd when 'log' log pretty msgmsg when 'hello' log "agent said hello: " + pretty msgmsg else log "unknow cmd: " + pretty msg # send a command to all agents, every 5 seconds every 5sec => @broadcast cmd: "foobar"data: "foo": "bar"
Agent (code describing an agent)
= @logger require'petri'common # these will appear in colors in the terminal info "hello, I do nothing" debug "got some options: " + pretty opts warn "woops something gone wrong" # emit a message, will be received by the master @emit cmd: "hello"foo: "bar" failure "what the heck?!" # kill the agent processexit -1
Documentation
List of utility fonctions in petri/common:
after(timeunit(function))
This function execute a block of code after T time units.
Has to be used together with a magic Number, like this:
after 5min -> consolelog "game over"
every(timeunit(function))
This function execute a block of code every T time units.
Has to be used together with a magic Number, like this:
every 3sec -> consolelog "checkpoint!"
Magic Number
Here is the list of supported magic time units:
- .ms
- .sec, .second, .seconds
- .min, .minute, .minutes
- .hour, .hours
- .day, .days
Tell me if you need more pre-built units
MakeId()
This function generate a unique random id. Warning:: it sucks. You should probably use node-uuid instead. But this is enough for basic debug cases
copy(obj)
Copy an object, using a JSON dump then parse. This is not efficient, I will try to remplace it with node-v8-clone, which is more efficient
P(x)
Probability of something. Examole:
- P(1.0) will always return 1
- P(0.8) will return 1 most of the time
- P(0.5) will return 1 or 0, with 50/50 chance
- P(0.0) will always return 0
It does not return true or false, but 1 or 0, so you can use it to do fuzzy (probabilistic) programming, with inference rules and other things like that. Have fun.
Usage:
if P 0.5 consolelog "A"else consolelog "B"
isFunction(something)
Stolen from underscore.js. Check if something is a Function
isUndefined(something)
Stolen from underscore.js. Check if something is undefined
isArray(something)
Stolen from underscore.js. Check if something is a true Array (eg. a String will return false)
isString(something)
Stolen from underscore.js. Check if something is a String
isNumber(something)
Stolen from underscore.js. Check if something is a Number
isBoolean(something)
Stolen from underscore.js. Check if something is a Boolean
randInt(min, max)
Random integer between min and max. Integer means: rounded.
round2(number)
Helper function to round a number to 2 decimals
round3(number)
Helper function to round a number to 3 decimals (yeah..)
sha1(string)
Compute the sha1 synchronously. Be warned.
NB_CORES
A constant indicating the number of core you can use to spawn workers. This function has an heuristic to save CPU by not counting the base core, see below.
Implementation:
cpus = Mathroundoscpuslengthif cpus < 3 then 1 else cpus - 2
pick(weighted_key_value_store)
Stolen from node-deck. This function picks a random item from a weighted index, see example:
store = key1: 50 key2: 200 key3: 10 key = pick store # most of the time, key2 will be extracted, sometimes key1, rarely key3
pretty obj
Prettify an object to make it human-readable. Equavalent to "inspect(obj, false, 20, true).toString()""
readFile(file_path)
Read the content of a file synchronously. Useful for simple command line script, than don't need to be async.
equivalent to: "fs.readFileSync(file_path, 'utf8')"