3

ノードの異種ツリーをトラバースできるジッパーを書くのに問題があります。私は i) マップのリストを持っています。各マップには ii) :inputs キーがあり、その値はマップのリストです。

ジッパーを使用してこれらの葉のそれぞれにアクセスし、計算値を追加したいと考えています。コード ブロックと入力ツリー データは次のとおりです。ジッパー コードを取得してリーフ ノードにアクセスし、{ :thing 123 } を追加できないようです。私は単純なものが欠けているに違いありません。洞察はありますか?

A)

      (ループ [loc (zip/zipper (またはマップ? リスト?)
                              #((if (map? %1) ;; ノードの子を取得
                                  (:入力 %1)
                                  %1 ))
                              #(%1) ;; 新しいノードを作成する
                              (:入力層ニューラルネットワーク)) ]

        (if (zip/end? loc)
          (zip/ルートロック)
          (if (map? loc)
            (再帰 (zip/次へ
                      (zip/edit loc merge { :thing 123 } )))
            (繰り返し (zip/次の場所))
          )
        )
      )

B)

     ({:入力
       ({:key :avolume, :value 2.25, :weight 0.4283380545172636, :bias 0}
        {:key :bvolume, :value 3.0, :weight 0.6970037374879661, :bias 0}
        {:key :ask, :value 1.32379, :weight 0.5387437158323669, :bias 0}
        {:key :bid, :value 1.3239, :weight 0.4648184032361037, :bias 0}
        {:key :time, :value 1.335902400676, :weight 0.43632873607404554, :bias 0}),
       :id "583c10bfdbd326ba34aed329139df6be2487ffc"}
      {:入力
       ({:key :avolume, :value 2.25, :weight 0.13162215440222336, :bias 0}
        {:key :bvolume, :value 3.0, :weight 0.23886901184352727, :bias 0}
        {:key :ask, :value 1.32379, :weight 0.8408470512339872, :bias 0}
        {:key :bid, :value 1.3239, :weight 0.27071013797961796, :bias 0}
        {:key :time, :value 1.335902400676, :weight 0.6304505838898373, :bias 0}),
       :id "583c10bfdbd326ba34aed329139df6be2487ffd"}
      {:入力
       ({:key:avolume,:value 2.25,:weight 0.8236972641966921,:bias 0}
        {:key :bvolume, :value 3.0, :weight 0.32421537754016705, :bias 0}
        {:key :ask, :value 1.32379, :weight 0.966306328543246, :bias 0}
        {:key :bid, :value 1.3239, :weight 0.8891668220470931, :bias 0}
        {:キー:時間、:値1.335902400676、:重み0.278993745549462、:バイアス0})、
       :id "583c10bfdbd326ba34aed329139df6be2487ffe"}
      {:入力
       ({:key:avolume,:value 2.25,:weight 0.27388486254027167,:bias 0}
        {:key :bvolume, :value 3.0, :weight 0.33659579299487363, :bias 0}
        {:key :ask, :value 1.32379, :weight 0.16610378593177033, :bias 0}
        {:key :bid, :value 1.3239, :weight 0.6964784902474896, :bias 0}
        {:key :time, :value 1.335902400676, :weight 0.6306732906337643, :bias 0}),
       :id "583c10bfdbd326ba34aed329139df6be2487fff"}
      {:入力
       ({:key:avolume,:value 2.25,:weight 0.8819171698935051,:bias 0}
        {:key :bvolume, :value 3.0, :weight 0.5944805362120958, :bias 0}
        {:key :ask, :value 1.32379, :weight 0.9060962647355373, :bias 0}
        {:key :bid, :value 1.3239, :weight 0.37647418075176464, :bias 0}
        {:キー:時間、:値1.335902400676、:重み0.7797681719480866、:バイアス0})、
       :id "583c10bfdbd326ba34aed329139df6be2488000"})

ありがとう

4

1 に答える 1

5

新しいノードを作成するジッパーの一部が間違っていると思います。ジッパー関数の定義を読むmake-nodeと、現在のノード、新しい子のシーケンスの 2 つの引数で呼び出されることがわかります。関数は新しいノードを返す必要があります。

#(%1)map または list を関数として呼び出そうとしているため、使用する式はまったく機能しません。

また、表現(or map? list?)は本当にあなたが望むことをしません。


テストのためだけにベクターに適応させました。

(defn mk-zip [ルート]
  (let [branch? (fn [ノード]
                  (ノード時
                    (or (and (map? node) (contains? node :inputs))
                        (ベクトル? ノード))))
        children (fn [ノード]
                   (状態
                     (nil? ノード) nil
                     (map? ノード) (:inputs ノード)
                     :else ノード))
        make-node (fn [ノードの子]
                    (状態
                      (nil? ノード) nil
                      (map? ノード) (関連ノード :inputs children)
                      (vector? ノード) ([] の子に)
                      :else ノード))]
    (zip/zipper ブランチ? children make-node root)))

(定義ルート [{:inputs
            [{:キー :ボリューム, :値 2.25, :ウェイト 0.4283380545172636, :バイアス 0}
             {:key :bvolume, :value 3.0, :weight 0.6970037374879661, :bias 0}
             {:key :ask, :value 1.32379, :weight 0.5387437158323669, :bias 0}
             {:key :bid, :value 1.3239, :weight 0.4648184032361037, :bias 0}
             {:キー:時間、:値 1.335902400676、:重み 0.43632873607404554、:バイアス 0}]、
            :id "583c10bfdbd326ba34aed329139df6be2487ffc"}])

マップ アイテムの更新が機能するようになりました。

(def z (mk-zip root))
(-> z zip/next zip/down 
    (zip/insert-right {:key :new :value -10}) 
    zip/up
    zip/node)

版画:

{:入力
 ({:key :avolume, :weight 0.4283380545172636, :bias 0, :value 2.25}
  {:キー:新規, :値 -10}
  {:key :bvolume, :weight 0.6970037374879661, :bias 0, :value 3.0}
  {:key :ask, :weight 0.5387437158323669, :bias 0, :value 1.32379}
  {:key :bid, :weight 0.4648184032361037, :bias 0, :value 1.3239}
  {:キー:時間、
   : 重み 0.43632873607404554,
   :バイアス 0,
   :値 1.335902400676})、
 :id "583c10bfdbd326ba34aed329139df6be2487ffc"}
于 2012-09-19T21:18:26.933 に答える