[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:004022] Re: GAnalysis::covariance のバグ



松葉さま

随分遅くなってすみませんが,内容的にとりこみました。
次のリリースで反映されます。

堀之内

> 堀之内さま,電脳 Ruby のみなさま: 京大M2 の松葉です.
> 
> GAnalysis::corelation を使っていて気付いたのですが,GAnalysis::covarinace にバグを見つけました.
> パッチを作成してみましたので,添付いたします (本文中に入れてあります).GPhys のバージョンは
> 1.5.0-1 です.
> 
> 内部で nary.div!(ndiv-1) という処理がなされていますが,NArrayMiss#div! がどうやら破壊的でないようです.
> irb で試した結果が以下です.ここで nary は NArrayMiss,ndiv は NArray::LINT が想定されていますので,
> それにあわせています.一応付しておくと,ruby-narray-miss (debian パッケージ) のバージョンは 1.2.8-3
> みたいです.
> 
> ---------- irb 実行例 ここから ----------
> irb(main):001:0> require 'numru/gphys'; include NumRu
> => Object
> irb(main):002:0> a = NArrayMiss[10.0, 20.0, 30.0]
> => NArrayMiss.float(3):
> [ 10.0, 20.0, 30.0 ]
> irb(main):003:0> b = NArray[20, 40, 60]
> => NArray.int(3):
> [ 20, 40, 60 ]
> irb(main):004:0> a.div!(b)   <---- 破壊的メソッドのつもり
> => NArrayMiss.float(3):
> [ 0.5, 0.5, 0.5 ]
> irb(main):005:0> a
> => NArrayMiss.float(3):
> [ 10.0, 20.0, 30.0 ]             <---- 実際には反映されていない
> ---------- irb 実行例 ここまで ----------
> 
> また,引数として,次元の整数値を指定すると動作しますが,次元名を与えるとエラーになります.
> GAnalysis::covariance では処理が実装されているのに対して,GAnalysis::corelation では実装されていない
> ので,NArray#sum(*dims) 実行時にエラーが出ます.なので,それにも対応できるようにしてみました
> (といってもコピーしただけですけど).
> 
> 以下,作成してみましたパッチです.特に問題なければ,取り込んでいただけると幸いです.
> 
> ---------- パッチここから ----------
> --- covariance.rb.org   2016-08-30 15:39:35.806303482 +0900
> +++ covariance.rb       2016-08-30 15:37:37.692734362 +0900
> @@ -48,7 +48,8 @@
>          nary /= (ndiv-1)
>          return UNumeric.new(nary, units), ndiv
>        else
> -        nary.div!(ndiv-1)
> +        ndiv = ndiv.sum(*dims)
> +        nary = nary.div!(ndiv-1)
>          vary = VArray.new(nary,
>                            {"long_name"=>"covariance","units"=>units.to_s},
>                            "covariance")
> @@ -79,6 +80,12 @@
>        gphys0 = gphys0.copy.replace_val(val0)
>        gphys1 = gphys1.copy.replace_val(val1)
> 
> +      if dims.length == 0
> +        dims = Array.new
> +        gphys0.rank.times{|i| dims.push i }
> +      else
> +        dims = dims.map{|dim| gphys0.dim_index(dim) }
> +      end
>        covariance, ndiv = gphys0.covariance(gphys1,*dims)
>        return covariance/(gphys0.stddev(*dims)*gphys1.stddev(*dims)),
> mask.to_type(NArray::LINT).sum(*dims)
>      end
> ---------- パッチここまで ----------
> 
> -- 
> 松葉 史剛 (Fumitaka MATSUBA)
> 京都大学大学院 理学研究科 地球惑星科学専攻
> 地球物理学教室 気象学研究室 M2
> E-mail: matsuba@xxxxxxxxxxxxxxxxxx
> 
>