純粋な Ruby でペトリ ネット ドメイン モデルを作成し、MongoDB で永続化する予定です。ペトリネットの場所と遷移には、「アーク」(場所 - 遷移矢印) 関係があり、おそらく他の関係もあります。これまでのところ、私のネットは小さいので、たとえば. 単一の Ruby ファイル、または YAML ファイル。しかし、私はすでに Mongo の味を知りたいと思っています。これは、生物学で一般的なように、ペトリネットが巨大になった場合に後で報われると思います。複雑さを避けるために、YPetri
簡単な例を示します。
# Places are basically glorified variables, with current contents (marking), and
# default contents (default_marking).
#
class Place
attr_reader :name, :default_marking
attr_accessor :marking
def initialize name, default_marking=0
@name, @default_marking = name, default_marking
end
def reset!; @marking = default_marking end
end
# Transitions specify how marking changes when the transition "fires" (activates).
# "Arcs" attribute is a hash of { place => change } pairs.
#
class Transition
attr_reader :name, :arcs
def initialize( name, arcs: {} )
@name, @arcs = name, arcs
end
def fire!
arcs.each { |place, change| place.marking = place.marking + change }
end
end
これで小さなペトリネットを作成できます:
A, B, C = Place.new( "A" ), Place.new( "B" ), Place.new( "C" )
# Marking of A is incremented by 1
AddA = Transition.new( "AddA", arcs: { A => 1 } )
# 1 piece of A dissociates into 1 piece of B and 1 piece of C
DissocA = Transition.new( "DissocA", arcs: { A => -1, B => +1, C => +1 } )
[ A, B, C ].each &:reset!
[ A, B, C ].map &:marking #=> [0, 0, 0]
AddA.fire!
[ A, B, C ].map &:marking #=> [1, 0, 0]
DissocA.fire!
[ A, B, C ].map &:marking #=> [0, 1, 1]
これは、一般的なアイデアを伝えるのに十分なはずです。オブジェクト モデルを Mongo 関連のライブラリの構文で書き直すのは気が進まない。クラスに「保存」Place
および「ロード」機能を追加したいだけです。Transition
私はMongoDBが初めてです。MongoDB はすでに私の Debian で動作します。Rubyから接続する方法がほとんどわかりません。適切なツールを選択するのに苦労しています。裸mongo
?Mongoid
? Mongo_mapper
? 他に何か?どちらをどのように使用すればよいですか? 私が提供したコード例を使用して、MongoDB との間で場所とトランジションのコレクションを保存およびロードする方法の実用的なコード例を教えてください。