2

純粋な 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から接続する方法がほとんどわかりません。適切なツールを選択するのに苦労しています。裸mongoMongoid? Mongo_mapper? 他に何か?どちらをどのように使用すればよいですか? 私が提供したコード例を使用して、MongoDB との間で場所とトランジションのコレクションを保存およびロードする方法の実用的なコード例を教えてください。

4

0 に答える 0