C#から使うC++ライブラリ(DLL)の作成方法

前回はC#で書かれたライブラリの作成方法でしたが、今回は、C#から使えるC++で書かれたライブラリの作成方法です。

C++と言っても、C++内部でクラスを使う事は可能ですが、C#から直接呼ぶ事が出来るのは、クラスではない関数のみとなります。
そのため、クラスオブジェクトをC++のライブラリとC#間でやり取りすることは出来ないので、注意してください。(構造体を引数で渡す事は可能です。)

 

正直、C++のライブラリの作成方法はあまり深く理解していないのですが、メモ程度に。。

 

事前にVisual Studio をデフォルトのままでインストールするとC++はインストールされないので、C++をインストールしておいてください。

 

まず、関数を呼び出すC#のプロジェクトを作成しておき、ソリューションの右ボタンで、

追加→新しいプロジェクト

を選択します。

 

次にプロジェクトを追加しますが、Visual Studio のバージョンにより画面が異なるため、各バージョンに合わせて確認ください。

Visual Studio 2017, 2019の場合

Visual Studio 2019には、上部に言語、OS別表示のフィルタをかけることが出来るので、C++、Windowsを選択します。

次にプロジェクトの一覧の中から Windowsデスクトップウィザードを選択します。

次にプロジェクト名とプロジェクトの場所を指定します。
プロジェクト名は、デフォルト設定ではライブラリ名になるので、ちゃんとした名前を付ける事をお勧めします。

次に アプリケーションの種類に ダイナミックリンクライブラリ(.dll) を選択し、追加オプションでは、
プリコンパイル済みヘッダー(P)シンボルのエクスポートにチェックを入れます。

→以降は、以下共通を参照ください。

Visual Studio 2015の場合

Visual C++ → Win32 → Win32プロジェクト

と選択し適当な名前(今回は CppDLL とします。)を付けOKボタンをクリックします。

 

表示されたウィザードで次へをクリックします。

 

アプリケーションの種類で DLL を選択し、慣れている人は 空のプロジェクト でいいんでしょうけど、私は慣れていないので、 シンボルのエクスポート と プリコンパイル済みヘッダー にチェックを入れ、完了をクリックします。

以下共通

ウィザードでDLLを作成すると、プログラムのたたき台となるサンプルコードを吐き出してくれるので、慣れないうちは、ウィザードを使った方がお勧めです。(私は、今でも使ってますが。。)

 

次にプロジェクトの設定を行います。

 

今どきのOSはほとんど64bitなので、今回は64bitOS用のライブライを作成するのを前提とします。

Visual Studio の 構成マネージャー をクリックします。

 

プラットフォームに x64 を選択します。

ビルドの部分いチェックが入っていない場合はチェックを入れます。

これを アクティブソリューションの構成のDebugReleaseの両方で行います。

 

これでけで、ソリューションのビルドを行うと、ソリューションフォルダの直下にx64フォルダが作成されます。

さらにその中のReleaseもしくはDebugフォルダの中に、このように↓dllファイルが作成されてますが、C#から、このdllファイルを使うにはさらに細工が必要になります。

 

以降は、C++プロジェクトの作成時にウィザードが吐き出した

  CPPDLL_API int fnCppDll(void);

の関数がC#から使えるようにC++のヘッダファイルを変更します。

 

C++ライブライのヘッダファイル(ここでは CppDll.h)を開き、C#から使う関数を

#ifdef  __cplusplus
extern "C" {
#endif	/* __cplusplus */

// ここに使用する関数を定義する

#ifdef  __cplusplus
}		/* extern "C" */
#endif	/* __cplusplus */

のように  extern “C” { } で関数の定義を挟み込みます。

こんな感じ↓

#ifdefの部分は、あんまり分かってない。。

 

次に作成したC++のライブラリファイル(*.dll)がC#から使用できるようにします。

ここは、いくつかやり方があり、好みが分かれるところだと思いますが、今回は、C++のプロジェクトが作成したDLLファイルの出力先をC#の出力先にに合わせるように変更します。

 

C++のプロジェクト名の部分を右クリックし、

  構成のプロパティ→全般→出力ディレクトリ

  $(SolutionDir)\WindowsFormsApplication1\bin\$(Configuration)\

とします。(※WindowsFormsApplication1はC#のプロジェクト名です。)

 

この出力ディレクトリの設定を 構成の Release と Debug の両方設定します。

 

これで、C#のプログラムから参照できる位置(C#のexeファイルと同じフォルダ)にdllファイルが出力されます。

 

この設定を間違うと、以下のようなエラーが表示されます。

 

今回は64bitOS用のDLLとして作成していますが、C#のプロジェクトはOSが64bitであってもプロジェクトが初期設定状態だと、32bitで動作するので、これを64bitで動作するように変更します。

 

C#のプロジェクト名を右クリックし、 プロパティ をクリックし、以下のウィンドウを表示させ、 左側メニューの ビルド を選択し 32ビットを優先 のチェックを外します。

この設定を 構成 の Debug および Release の両方行います。

 

この設定を間違うと、 BadImageFormatExceptionはハンドルされませんでした。 というエラーメッセージが表示れます。

 

これで、とりあえずC#からC++の関数が動作します。

C#からは、以下のようなコードでC++の関数定義を行います。

using System.Runtime.InteropServices;

[DllImport("CppDll.dll")]
public static extern int fnCppDll();

“CppDll.dll”の部分は適宜、作成したdllファイル名に合わせて下さい。

 

実際に関数を呼び出す部分は、

private void button1_Click(object sender, EventArgs e)
{
    int n = fnCppDll();

    MessageBox.Show(n.ToString());
}

のように、ボタンクリックイベントで呼び出したとすると、以下のように表示されると動作はOKです。

 

さらに、これだけど少し足りなくて、C++のプロジェクトのプロパティで、

構成プロパティ→C/C++→コード生成→ランタイムライブラリ

の部分で、構成が

Releaseのとき:マルチスレッド(/MT)

Debugのとき:マルチスレッドデバッグ(/MTd)

に変更しておきます。

この設定をしないと、別のPCでプログラムを実行した際に、開発を行ったVisual Studioと同じバージョンのC++ランタイム(再頒布可能パッケージ)がインストールされていないと動作してくれないので、いざ、実行環境で動作させようとした時にハマったりもします。

 

以上、少し怪しい部分もあるかと思いますが、こんな感じで。。

 

関連記事

【C#エラー】System.BadImageFormatException 間違ったフォーマットのプログラムを読み込もうとしました。

C#ライブラリ(DLL)の作成方法

C#から使う、C#で書かれたライブラリ(*.dll)の作成方法です。
C#から使う、C言語ライブラリの作成方法はこちらを参照ください。

 

まず、ライブラリを呼び出す側のプロジェクトを作成します。

 

ここでは、Windowsフォームアプリケーションを作成するのに、

テンプレート→Visual C#→Windows→Windowsフォームアプリケーション

と選択し、名前を適当に付けてOKボタンをクリックします。

 

これで、呼び出し側のプロジェクトが作成されました。

 

次に、C#ライブラリ用のプロジェクトを作成します。

今、作成したプロジェクトの1つ上の階層に作成されている ソリューション の文字を右クリックし、

追加→新しいプロジェクト

を選択します。

 

今度はライブラリを作成するので、

  Visual C#→Windows→クラスライブラリ

と選択し、名前を適当に付けてOKボタンをクリックします。

 

すると、最小限のコードが生成されます。

 

通常は、Class1とかいうクラス名ではなく、もっとわかりやすい名前に変えますが、とりあえず、このまま次に進みます。

 

次に、2つの値を足すだけの簡単なメソッドを追加してみます。

 

この状態で、ビルドすると、ライブラリのプロジェクトフォルダのbinフォルダのDebugもしくはReleaseフォルダの中にライブラリファイル(CSharpDll.dll)が作成されます。

 

しかし、それだけだと、ライブラリを呼び出す元のプロジェクト(ここではWindowsFormsApplication1)からは使う事ができないため、参照の設定を行います。

 

参照は呼び出す元の方のプロジェクトにある、参照の文字を右クリックし、参照の追加を選択します。

 

ここで、ライブラリファイルを選択する方法もあるのですが、プログラム作成中はライブラリのプロジェクトを参照した方がデバッグ等が便利なので、プロジェクトの参照を行います。

 

  プロジェクト→ソリューション

 

と選択すると、ライブラリのプロジェクト名が表示されているので、プロジェクト名の左側にあるチェックボックスにチェックを入れ、OKボタンをクリックします。

 

これで、参照元に参照先のライブラリ名(ここではCSharpDll)が追加され、ライブラリが使用できる状態になります。

 

 

試しにフォーム上にボタンを配置します。

 

 

ボタンをダブルクリックし、作成されたクリックイベント内に、今、作成したライブラリのメソッドを追加してみます。

 

これで、ボタンをクリックした時に、以下のように表示されれば、C#ライブラリの作成は成功です。

 

ここでは、ライブラリのプロジェクトの参照として行いましたが、こうすることで、ライブラリのメソッド内へのステップイン実行もできるようになるので、かなり便利です。

 

一つポイントとしては、デフォルトのまま、ライブラリを作成すれば特に問題は無いのですが、ライブラリのプロジェクトのプラットフォームはAnyCPUにしておくのをお勧めします。

 

こうしておく事で、呼び出し元のプロジェクトがx86だろうが、x64であっても、同一のライブラリファイル(ここではCSharpDll.dll)を使用することができるようになります。

これを間違うと、x86用のdllファイル、x64用のdllファイルのそれぞれを作成する必要が出てくるので、少々面等になります。

【C#】文字列の回転描画

文字列を回転して描画するのはGraphicsオブジェクトをワールド変換して描画することも可能ですが、ワールド変換はGraphicsオブジェクト全体の座標系が変換されてしまうため、少々使いづらく感じます。

そこで、文字だけを回転するGraphicsPathを使った方法で関数にまとめてみました。

この関数で、文字の描画位置、回転、回転の基準位置(左上、中心など)を設定できるようにしています。

 

実行結果の画面

 

サンプルプログラム

private void Form1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    // アンチエイリアスの設定
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    // グリッド線の描画(50画素ピッチ)
    for (int i = 0; i < this.Width; i += 50)
    {
        g.DrawLine(Pens.Black, i, 0, i, this.Height);
    }
    for (int j = 0; j < this.Height; j += 50)
    {
        g.DrawLine(Pens.Black, 0, j, this.Width, j);
    }

    var font = new Font("Arial", 20);

    // 文字の中心の座標が(100, 100)を中心に-30度回転
    var format = new StringFormat();
    format.Alignment = StringAlignment.Center;      // 左右方向は中心寄せ
    format.LineAlignment = StringAlignment.Center;  // 上下方向は中心寄せ
    DrawString(
        g,
        "[文字の中心が基準]",
        font,
        new SolidBrush(Color.Blue),
        100, 100,
        -30,
        format
        );

    // 文字の左上の座標が(200, 100)を中心に45度回転
    format.Alignment = StringAlignment.Near;      // 左右方向は左寄せ
    format.LineAlignment = StringAlignment.Near;  // 上下方向は上寄せ
    DrawString(
        g,
        "[文字の左上が基準]",
        font,
        new SolidBrush(Color.Red),
        200, 100,
        45,
        format
        );
}

/// <summary>
/// 文字列の描画、回転、基準位置指定
/// </summary>
/// <param name="g">描画先のGraphicsオブジェクト</param>
/// <param name="s">描画する文字列</param>
/// <param name="f">文字のフォント</param>
/// <param name="brush">描画用ブラシ</param>
/// <param name="x">基準位置のX座標</param>
/// <param name="y">基準位置のY座標</param>
/// <param name="deg">回転角度(度数、時計周りが正)</param>
/// <param name="format">基準位置をStringFormatクラスオブジェクトで指定します</param>
public void DrawString(Graphics g, string s, Font f, SolidBrush brush, float x, float y, float deg, StringFormat format)
{
    using (var pathText = new System.Drawing.Drawing2D.GraphicsPath())  // パスの作成
    using (var mat = new System.Drawing.Drawing2D.Matrix())             // アフィン変換行列
    {
        // 描画用Format
        var formatTemp = (StringFormat)format.Clone();
        formatTemp.Alignment = StringAlignment.Near;        // 左寄せに修正
        formatTemp.LineAlignment = StringAlignment.Near;    // 上寄せに修正

        // 文字列の描画
        pathText.AddString(
                s,
                f.FontFamily,
                (int)f.Style,
                f.SizeInPoints,
                new PointF(0, 0),
                format);
        formatTemp.Dispose();

        // 文字の領域取得
        var rect = pathText.GetBounds();

        // 回転中心のX座標
        float px;
        switch (format.Alignment)
        {
            case StringAlignment.Near:
                px = rect.Left;
                break;
            case StringAlignment.Center:
                px = rect.Left + rect.Width / 2f;
                break;
            case StringAlignment.Far:
                px = rect.Right;
                break;
            default:
                px = 0;
                break;
        }
        // 回転中心のY座標
        float py;
        switch (format.LineAlignment)
        {
            case StringAlignment.Near:
                py = rect.Top;
                break;
            case StringAlignment.Center:
                py = rect.Top + rect.Height / 2f;
                break;
            case StringAlignment.Far:
                py = rect.Bottom;
                break;
            default:
                py = 0;
                break;
        }

        // 文字の回転中心座標を原点へ移動
        mat.Translate(-px, -py, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 文字の回転
        mat.Rotate(deg, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 表示位置まで移動
        mat.Translate(x, y, System.Drawing.Drawing2D.MatrixOrder.Append);

        // パスをアフィン変換
        pathText.Transform(mat);

        // 描画
        g.FillPath(brush, pathText);
    }
}

プログラムの解説

回転中心の座標(表示位置の座標)をx, y で指定します。

文字の回転角度(deg)は時計方向が正となります。

文字列の回転の基準位置(回転の中心の位置)はStringFormatクラスで指定します。

StringFormat.Alignmentプロパティが左右方向の基準位置で、

StringAlignment.Near 左寄せ
StringAlignment.Center 中心寄せ
StringAlignment.Far 右寄せ

となります。

同様にStringFormat.LineAlignmentプロパティが上下方向の基準位置で、

StringAlignment.Near 上寄せ
StringAlignment.Center 中心寄せ
StringAlignment.Far 下寄せ

となります。

 

これを使うと、こんな時計の文字盤のように文字を配置するのも簡単に書くことができます。

 

関連記事

【C#.NET】マイクロソフト仕様のアフィン変換

【C#】GraphicsPath

【C#】GraphicsPathの描画

【C#】寸法線の描画

 

画像処理のためのC#テクニックへ戻る

【C#】メモリの値コピー、ポインタ、1次元、2次元、3次元配列間

C#でメモリのポインタ(IntPtr)と一次元配列間の値のコピーにはMarshal.Copyメソッド(名前空間:System.Runtime.InteropServices)を用います。

Marshal.Copyにはポインタから一次元配列へのコピー および 一次元配列からポインタへのコピーが用意されています。

一次元配列の型は、Single[], IntPtr[], Byte[], Single[], Int64[] , Int32[] , Int32[] , Int16[] , Double[]が指定可能です。

Mershal.Copyが可能なのは、あくまでも一次元配列が対象となります。

 

多次元配列(1次元、2次元、3次元…)と多次元配列間の値のコピーにはBuffer.BlockCopyメソッド(名前空間:System)を用います。

このメソッドでは、異なる次元の配列間、異なる型の配列間でメモリをコピーしてくれます。

異なる型の場合は、値のコピーではありません。

どちらかというと、C言語のCopyMemoryの挙動に似ています。

 

サンプルプログラム

// 一次元配列、二次元配列、三次元配列を確保(全て24バイト)
var arr1D = new byte[24] ;
var arr2D = new byte[6, 4];
var arr3D = new byte[2, 3, 4];
var arrUS = new ushort[12];

// メモリの確保(24バイト)
IntPtr ptr = Marshal.AllocHGlobal(24);

// 値の代入
for (byte i = 0; i < 24; i++)
{
    Marshal.WriteByte(ptr, i, i);
}
// ポインタから一次元配列へコピー
Marshal.Copy(ptr, arr1D, 0, arr1D.Length);

// 一次元配列から二次元配列へコピー
Buffer.BlockCopy(arr1D, 0, arr2D, 0, arr1D.Length * sizeof(byte));
// 二次元配列から三次元次元配列へコピー
Buffer.BlockCopy(arr2D, 0, arr3D, 0, arr2D.Length * sizeof(byte));
// byte配列からushort配列へコピー
Buffer.BlockCopy(arr1D, 0, arrUS, 0, arr1D.Length * sizeof(byte));

// メモリの解放
Marshal.FreeHGlobal(ptr);

 

実行後の配列の値は以下のようになります。

 

ushort配列の結果が少しわかりづらいですが、byte配列の2バイト分が1つのushortの値として格納されます。

 

 

参考ページ

【C#】配列の中身をメモリで確認する方法

 

【C#】配列の中身をメモリで確認する方法

C言語の時は、ポインタの中身をメモリで参照する事が多かったのですが、C#をメインで触るようになってからは、メモリの中身を参照することは無くなってしまい、いざ、やってみようとすると、やり方がわかりづらかったので記事にしました。

まず、Visual Studio にメモリのウィンドウを表示するのですが、ウィンドウ表示メニューがステップ実行中にしか表示してくれないため、メモリを見たい場所でブレークポイントを置いて停止させます。

 

この状態で、Visual Studio のメニューの デバッグ→ウィンドウ→メモリ→メモリ1(1) と選択するとメモリウィンドウが表示されます。

 

 

さらにメモリで表示させたい変数をメモリウィンドウへDrag&Dropすることで、配列の中身をメモリで参照することができます。

 

 

と、本当にやりたかったのは、二次元配列の時に、A[x, y]のように、左側の添え字の方からメモリに値が格納されていくのか? それともA[y, x]のように右側の添え字の方から格納されるのか?を確認したかったのですが、確認のため、

var arr2D = new byte[16, 16];

for (int j = 0; j < 16; j++)
{
    for (int i = 0; i < 16; i++)
    {
        arr2D[j, i] = (byte)((j << 4) + i);
    }
}

のようなソースコードで、8ビット(1バイト)中の下位4ビットに i の値を、上位4ビットに j の値を格納するプログラムをステップ実行で確認したところ、メモリへは、以下のように格納されていました。

 

 

ということで、多次元配列の時、配列の値は右側の添え字の方から格納される事がわかります。

 

こっち↓の方が並びは分かりやすいですね。

 

C# へ戻る

【C#】アフィン変換を用いて画像ビューアを作ろう!

C#にはアフィン変換に用いる行列用の

Matrixクラス(名前空間:System.Drawing.Drawing2D)

というクラスがあり、これを駆使すると、以下のようなプログラムを比較的簡単に作成することができます。

 

 

プログラムの実行ファイルはこちらより→ AffineImage101.zip

ソースコードはGitHubで公開しています。

https://github.com/ImagingSolution/AffineImage

 

プログラムの機能としては

  • 画像ファイルのDrag&Dropで画像をピクチャボックス全体に表示
  • マウスのドラッグで表示画像の移動
  • マウスホイールの回転でマウスポインタを中心に画像の拡大縮小
  • マウスホイールの回転 + Shiftキー でマウスポインタを中心に画像の回転
  • マウスのダブルクリックで画像をピクチャボックス全体に表示
  • ステータスバーにマウスポインタのピクチャボックス座標と、画像上の座標を表示

となります。

 

ここで用いていたMatrixクラスの主なメソッドは

Translate 平行移動
Scale 拡大縮小
RotateAt 指定した点を中心に回転
Reset リセット、単位行列の代入
Invert 逆行列を求める
TransformPoints 点の配列をアフィン変換する

となります。

ただ、これだけだと少し物足りないので、以下のメソッドを拡張メソッドとして追加しています。

ScaleAt 指定した点を中心に拡大縮小
ZoomFit 画像をピクチャボックスの大きさに合わせる

 

以下、ソースコードの解説です。

 

アフィン変換行列に基づいて画像の表示

DrawImageメソッド(名前空間:System.Drawing)には、描画する画像の領域と、描画先の座標を画像の左上、右上、左下の順でPointFの配列で指定することで、画像を任意場所や大きさで表示することが可能となります。

この描画先の座標をアフィン変換行列で求めて画像を表示しています。


public static void DrawImage(this Graphics g, Bitmap bmp, System.Drawing.Drawing2D.Matrix mat)
{
    if ((g == null) || (bmp == null))return;

    // 画像の画素の外側の領域
    var srcRect = new RectangleF(
            -0.5f,
            -0.5f,
            bmp.Width,
            bmp.Height
        );

    // 画像の左上、右上、左下の座標
    var points = new PointF[] {
            new PointF(srcRect.Left, srcRect.Top),  // 左上
            new PointF(srcRect.Right, srcRect.Top), // 右上
            new PointF(srcRect.Left, srcRect.Bottom)// 左下
    };

    // アフィン変換で描画先の座標に変換する
    mat.TransformPoints(points);

    // 描画
    g.DrawImage(
        bmp,
        points,
        srcRect,
        GraphicsUnit.Pixel
        );
}

 

ただし、画像の左上の座標は(-0.5, -0.5)となるのでご注意下さい。

(参考)

【C#】画像の座標系

 

 

指定した点を中心に拡大縮小

アフィン変換で行う拡大縮小の変換行列は座標の原点を中心に拡大縮小するため、単に拡大縮小のアフィン変換行列を掛けただけでは、意図しない拡大縮小となります。

そこで、アフィン変換を組み合わせて、

中心座標を原点へ移動→拡大縮小→原点から元の位置へ移動

の変換を行うと、指定して点中心の拡大縮小となります。

 


public static void ScaleAt(this System.Drawing.Drawing2D.Matrix mat, float scale, PointF center)
{
    // 原点へ移動
    mat.Translate(-center.X, -center.Y, System.Drawing.Drawing2D.MatrixOrder.Append);

    // 拡大縮小
    mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);

    // 元へ戻す
    mat.Translate(center.X, center.Y, System.Drawing.Drawing2D.MatrixOrder.Append);

}

(参考)

任意点周りの回転移動(アフィン変換)

 

画像をピクチャボックスに合わせて表示する

ここでのアフィン変換の考え方は、まず、画像の左上の座標をピクチャボックスの原点に合わせるため、(+0.5, +0.5)だけ平行移動(Translate)します。

↓ (+0.5, +0.5)だけ平行移動

 

次に、画像の縦横比とピクチャボックスの縦横比を比較して、画像が縦長の場合、画像の縦の長さとピクチャボックスの縦の長さが揃うように画像を拡大縮小(Scale)します。

画像が横長の場合は、横の長さが合うように画像を拡大縮小(Scale)します。

最後に、画像がピクチャボックスの中心に来るように平行移動(Translate)します。


public static void ZoomFit(this System.Drawing.Drawing2D.Matrix mat, PictureBox pic, Bitmap bmp)
{
    if (bmp == null) return;

    // アフィン変換行列の初期化(単位行列へ)
    mat.Reset();

    // 0.5画素分移動
    mat.Translate(0.5f, 0.5f, System.Drawing.Drawing2D.MatrixOrder.Append);

    int srcWidth = bmp.Width;
    int srcHeight = bmp.Height;
    int dstWidth = pic.Width;
    int dstHeight = pic.Height;

    float scale;

    // 縦に合わせるか?横に合わせるか?
    if (srcHeight * dstWidth > dstHeight * srcWidth)
    {
        // ピクチャボックスの縦方法に画像表示を合わせる場合
        scale = dstHeight / (float)srcHeight;
        mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 中央へ平行移動
        mat.Translate((dstWidth - srcWidth * scale) / 2f, 0f, System.Drawing.Drawing2D.MatrixOrder.Append);
    }
    else
    {
        // ピクチャボックスの横方法に画像表示を合わせる場合
        scale = dstWidth / (float)srcWidth;
        mat.Scale(scale, scale, System.Drawing.Drawing2D.MatrixOrder.Append);
        // 中央へ平行移動
        mat.Translate(0f, (dstHeight - srcHeight * scale) / 2f, System.Drawing.Drawing2D.MatrixOrder.Append);
    }
}

 

ピクチャボックスの座標から、元の画像の座標を求める

これまで説明してきたアフィン変換の行列は、画像の座標をピクチャボックスの座標へ変換するためのアフィン変換行列を求めています。

それでは、その逆のピクチャボックスの座標を元の画像の座標へ変換するには、アフィン変換行列の逆行列を求めて座標変換することで、元の画像を求める事ができます。

この処理をサンプルプログラムでは、MouseMoveイベントで行っています。

その一部抜粋です。


private void picImage_MouseMove(object sender, MouseEventArgs e)
{
    ////////////////////////////
    // マウスポインタの座標と画像の座標を表示する

    // マウスポインタの座標
    lblMousePointer.Text = $"Mouse {e.Location}";

    // アフィン変換行列(画像座標→ピクチャボックス座標)の逆行列(ピクチャボックス座標→画像座標)を求める
    // Invertで元の行列が上書きされるため、Cloneを取ってから逆行列
    var invert = _matAffine.Clone();
    invert.Invert();

    var pf = new PointF[] { e.Location };

    // ピクチャボックス座標を画像座標に変換する
    invert.TransformPoints(pf);

    // 画像の座標
    lblImagePointer.Text = $"Image {pf[0]}";

}

(参考)

【C#】アフィン変換の相互座標変換

【C#.NET】マイクロソフト仕様のアフィン変換

 

以上、如何だったでしょうか?

「アフィン変換」と言うと、「えっ?行列の計算??」「なんか難しそう」と言われて何かと敬遠されがちなのですが、アフィン変換に少し慣れると、計算も比較的スッキリとするかと思います。

私からすると、ここでやっている計算を幾何学的に求めようとすると、そっちの方がはるかに大変。。

 

画像をピクチャボックスに合わせて表示するで紹介しているようにアフィン変換行列を一発で求めようとするのではなく、変換前の状態から変換後の状態へと変換するまでの手順を考え、その手順を行列で表して掛けていく部分がポイントとなります。

アフィン変換の行列の計算部分では、画像そのものを拡大縮小/平行移動している訳ではなく、たかだか3x3の行列の積を計算しているだけなので、計算量としても少なくて済みます。

 

画像処理のためのC#テクニックへ戻る

C#から使える画像処理ライブラリ

画像処理のプログラムでは、当然ながら画像の表示や、操作するボタンなどが欲しくなるので、GUIのプログラム作成が簡単なC#が割とよく用いられています。

しかし、画像処理そのものをC#でやるには処理速度に不満もあるので、GUIはC#、画像処理部はC言語で処理が書かれた画像処理ライブラリを用いる事となります。

 

そこで、C#から使える画像処理ライブラリにはどんなものがあるのか?紹介したいと思います。

 

個人で使うなら

ほぼ、OpenCvSharpで決まりだと思います。

USBカメラも使えるし、バージョンアップもされているし、作者は日本人なので。。

OpenCVをラップしているので、画像処理時間も普通にプログラムを組むよりは圧倒的に速いかと思います。

 

インストール方法については、GitHubに少し書かれていますが、NuGetからインストールするのが基本のよう。

詳細は「OpenCvSharp インストール」で検索してみて、新しめの記事を参照して頂ければわかると思います。

 

マニュアル

https://shimat.github.io/opencvsharp_docs/index.html

GitHub

https://github.com/shimat/opencvsharp

 

会社で使うなら

「会社で使う」というか、使用するカメラが工業用のカメラを使うなら、以下の2つの画像処理ライブラリが、よく使われているように感じます。

 

●Cognex Vision Pro

●MVTec HALCON

 

両方とも数十万円するので、個人で買えるようなレベルではありませんが、OpenCVと何か違うか?というと、私が思うにはテンプレートマッチングの性能と工業用のカメラに対応している部分だと思います。

 

テンプレートマッチングについては、OpenCVのテンプレートマッチングでは回転やスケール変動には対応していませんが、これらのライブラリは対応しています。

さらには、袋の表面に印刷された画像のように、画像が歪んだ状態でもマッチングしてくれる機能もあります。OpenCVにも特徴点ベースのマッチングはありますが、やっぱりこっちの方が良いかと思います。

 

工業用のカメラを使うと何がいいか?という部分についてですが、カメラの画素数やフレームレートなどもそうですが、一番大きいのは同期撮影が出来る点だと思います。

例えば、ベルトコンベア上を流れる製品を撮影するような場面では、被写体は毎回画像の中央で撮影したくなりますが、カメラのフレーム単位で撮影タイミングを制御できないと、毎回撮影位置がばらついてしまいます。

 

OpenCVからは工業用のカメラを制御することは、ほとんどの場合、出来ないのですが、カメラ専用のSDK(もしくは画像入力ボードのSDK)を用いて画像を撮影し、撮影したデータをOpenCVに渡して画像処理を行う事も可能なので、やっぱり、一番差が大きいのはテンプレートマッチングの性能でしょうかね。

 

ちなみに、マシンビジョン業界でPythonが使われる事はほとんどありません。(聞いた事がありません。)

Pythonが出来ない私。。

 

画像処理のためのC#へ戻る

【C#】領域(Rectangle)全体を大きくする、小さくする

Rectangle構造体であらわされた領域全体を左右方向、上下方向に大きく/小さくするには

Inflateメソッドを用います。

 

コード例

private void Form1_Paint(object sender, PaintEventArgs e)
{
    // 元の領域1
    var rectSrc1 = new Rectangle(20, 20, 50, 30);
    e.Graphics.DrawRectangle(Pens.Black, rectSrc1);

    // 領域を大きくする
    // Rectangleを左右それぞれ3画素、上下それぞれ6画素大きくする
    rectSrc1.Inflate(3, 6);
    e.Graphics.DrawRectangle(Pens.Red, rectSrc1);

    // 元の領域2
    var rectSrc2 = new Rectangle(120, 20, 50, 30);
    e.Graphics.DrawRectangle(Pens.Black, rectSrc2);

    // 領域を小さくする
    // Rectangleを左右それぞれ6画素、上下それぞれ3画素小さくする
    rectSrc2.Inflate(-6, -3);
    e.Graphics.DrawRectangle(Pens.Red, rectSrc2);
}

 

実行結果

 

画像処理のためのC#へ戻る

【C#】RectangleRectangleFの相互変換

あまりやる事は無いのですが、Rectangle(名前空間:System.Drawing)とRectangleFの相互変換について調べてみました。

RectangleからRectangleFへ変換

これに関しては、型は変わるものの、値そのものは変わらないので、ほぼ、代入するようなノリで以下のようにすると変換ができます。

var rect = new Rectangle(20, 10, 60, 40);
RectangleF rectF = rect;

RectangleFからRectangleへ変換

こちらは値を小数から整数へ切り詰める必要があるので、値を切り捨てや四捨五入する必要が出てきますがRectangle構造体には値を切り捨てる(intでキャストする)Truncateメソッド、切り上げを行うCeilingメソッド、四捨五入を行うRoundメソッドが用意されています。

ここでいうですが、RectangleF構造体のX, Y, Width, Heightプロパティに関して切り捨て、切り上げ、四捨五入が行われます。

 

プログラム例

var rectF = new RectangleF(0.5f, -1.5f, 10.5f, 5.5f);

Rectangle rect;
rect = Rectangle.Round(rectF);      // 四捨五入
rect = Rectangle.Truncate(rectF);   // 切り捨て(intでキャスト)
rect = Rectangle.Ceiling(rectF);    // 切り上げ

結果は

X Y Width Height
オリジナル 0.5 -1.5 10.5 5.2
Round 0 -2 10 5
Truncate 0 -1 10 5
Ceiling 1 -1 11 6

となります。

ここで気になるポイントとしては、Round(四捨五入)でX座標の0.5が0になってしまっています。(期待しているのは1)

 

この四捨五入に関しては

【C#】四捨五入

のページでも書いていますが、座標に関する値の四捨五入は、私は

int x, y;
y = (int)Math.Floor(x + 0.5);

のように書くようにしています。

 

以上のことから、RectangleFからRectangleへ変換するには

var rectF = new RectangleF(0.5f, -1.5f, 10.5f, 5.5f);
var rect = new Rectangle(
        (int)Math.Floor(rectF.X + 0.5),
        (int)Math.Floor(rectF.Y + 0.5),
        (int)Math.Floor(rectF.Width + 0.5),
        (int)Math.Floor(rectF.Height + 0.5)
    );

のように書くようにしています。

このときの結果は

X Y Width Height
オリジナル 0.5 -1.5 10.5 5.2
変換後 1 -1 11 5

となります。

 

せっかくRectangle構造体にRoundメソッドが用意されているのに、いまいち使えず、ベタに書いた方が良いようです。。

 

【参考ページ】

●.NET Frameworkのソースコード(Rectangle構造体)

https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Rectangle.cs

●Microsoft Docs Rectangle構造体

https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.rectangle

 

画像処理のためのC#へ戻る

【C#】座標が領域内にあるか?調べる方法

マウスをクリックした時など、任意の座標がある領域の範囲内にあるか?どうか?調べたい場合があります。

 

これを調べるには、四角形の領域の場合、Rectangleクラス(名前空間:System.Drawing)のContainsメソッドを用います。

さらに複雑な形状の領域の場合、GraphicsPath(名前空間:System.Drawing.Drawing2D)のIsVisibleメソッドを用います。

 

四角形領域の場合のコード例

bool insideFlg;

var rect = new Rectangle(2, 2, 8, 8);
for (int i = 0; i < 12; i++)
{
    insideFlg = rect.Contains(i, i);
    System.Diagnostics.Debug.WriteLine($"四角の場合:{i}, {insideFlg}");
}

実行結果

四角の場合:0, False
四角の場合:1, False
四角の場合:2, True
四角の場合:3, True
四角の場合:4, True
四角の場合:5, True
四角の場合:6, True
四角の場合:7, True
四角の場合:8, True
四角の場合:9, True
四角の場合:10, False
四角の場合:11, False

丸領域の場合のコード例

bool insideFlg;

var path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddEllipse(2, 2, 8, 8);
for (int i = 0; i < 12; i++)
{
    insideFlg = path.IsVisible(i, i);
    System.Diagnostics.Debug.WriteLine($"丸の場合:{i}, {insideFlg}");
}

実行結果

丸の場合:0, False
丸の場合:1, False
丸の場合:2, False
丸の場合:3, False
丸の場合:4, True
丸の場合:5, True
丸の場合:6, True
丸の場合:7, True
丸の場合:8, True
丸の場合:9, False
丸の場合:10, False
丸の場合:11, False

 

画像処理のためのC#へ戻る

【C#】グラフのメモリ間隔の計算

C#でグラフを書く場合はChartを使うと簡単に書く事ができますが、Chartだけでは物足り無い事や、描画速度が遅かったりするので、自前でグラフを書こうとしたときに、Chartでやっているグラフの軸の間隔(下図の例では20)は、どうようにして決めているのか?
いまいち分からなかったので、調べてみました。

 

 

本当は、ソースコードから、どうやっているのか?見たかったのですが、よく分からなかったので、とりあえず、Chartの動きをよ~く見てみました。

 

下図の例は棒グラフで、値を(1, 1),(2, 2),(3, 3),(4, 4),(5, 5)・・・
とデータを追加した時の様子

 

すると、軸の間隔は

 

0.2、0.5、1、2、5、10、20、50、100、200、500・・・

 

という風に変化している事がわかりました。

結局、値そのものは 1、2、5 の繰り返し+指数で表現できそうだったので、グラフの最大値を浮動小数点で表してみると、仮数の部分の数値で1,2,5のいづれかが決まっているようでした。

 

例えば、125の場合は 1.25x10 なので、仮数は1.25で、この時のグラフの間隔は 0.2x10 の 20 となります。

 

仮数 グラフ間隔
1.5未満 0.2x10n
3.5未満 0.5x10n
5以下 1.0x10n
その他 2.0x10n

 

このグラフの間隔を関数にしたのがこちら↓

/// <summary>
/// グラフ間隔の計算
/// </summary>
/// <param name="value">グラフの最大値</param>
/// <returns></returns>
private double GetAxisStep(double value)
{
    // 指数
    double exponent = Math.Pow(10, Math.Floor(Math.Log10(value)));
    // 仮数
    double significand = value / exponent;

    // グラフ間隔
    double axisStep;

    if (significand < 1.5)
    {
        axisStep = 0.2 * exponent;
    }
    else if (significand < 3.5)
    {
        axisStep = 0.5 * exponent;
    }
    else if (significand <= 5.0)
    {
        axisStep = 1.0 * exponent;
    }
    else
    {
        axisStep = 2.0 * exponent;
    }
    return axisStep;
}

もう少し、綺麗な書き方ありそうですが。。

【C#,WPF】多ビット画像の取り扱い

一般的なカメラであれば、モノクロの画像であれば8bit(256諧調)、カラー画像であれば24bit(R,G,Bそれぞれ8bit)の画像が一般的なのですが、マシンビジョン用のカメラでは、1画素あたり10~14bitぐらいまでの諧調を持つカメラがあるのですが、この画像データをプログラム的に取り扱うには、通常のWindows Forms用のC#(Bitmapクラス)では出来ませんでした。。

かなり昔の評価になりますが、評価した結果はこちら↓です

Format16bppGrayScaleは使えるのか?実験してみた

http://imagingsolution.blog.fc2.com/blog-entry-65.html

 

この時に、「WPFなら出来ますよ!」というコメントを頂いていたのを、今更ながらに評価してみました。

 

WPFではSystem.Windows.Media.PixelFormatsクラスにGray16(16ビットのモノクログレースケール)、Bgr101010(R,G,B各10ビットのカラー画像)、Rgb48(R,G,B各16ビットのカラー画像)があり、個人的な使いそうな、この3つについて評価しました。

 

参考までに、Bgr101010のフォーマットでは32ビットの整数型(uint)に下位ビットからB,G,Rの順で輝度値が格納されています。

 

Rgb48のフォーマットは16ビットの整数型(ushort)にカラーデータがR,G,B,R,G,B・・・の順で格納されています。

一般的な24bitのカラー画像はB,G,R,B,G,R・・・の順なので、ここが少しはまりました。

評価方法

配列にカラーグラデーションのデータを格納し、これを画像ファイルに保存し、ファイルを読み込んで元の画像データに復元できるか?という内容で行いました。

画像データを復元したいので、ファイル形式は非圧縮、可逆圧縮であろうbmp,tiff,pngの3つのファイルで行いました。

(評価に用いた画像)

 

評価プログラム

評価に用いたプログラムはこんな感じ↓です。

ボタンをクリックすると、ボタンに示している画像ファイルを作成し、メニューのFile→Openで開くとファイルフォーマットとビット数が表示されるようになっていますが、基本的にデバッグ実行をしながら、各種パラメータをウォッチで見ながら確認を行いました。

 

評価に用いたプログラムはGitHubに置いておきましたので、もしよかったら評価してみてください。

https://github.com/ImagingSolution/ImageFileArrayConverter

 

結果

各ボタンをクリックして、エクスプローラでファイルのプロパティを確認したのが、以下の通りです。

 

保存 読み込み
bmp tif png bmp tif png
Gray16 ×

64bit

Bgr101010 ×

64bit

× ×
Rgb48 ×

64bit

表中の横棒(―)はファイル保存の時点でダメなので、ファイル読み込みの評価は行っておりません。

 

Bgr101010は全滅

Gray16はtifとpngファイルはOK

Rgb48もtifとpngファイルはOK

 

という結果になりました。

ただし、Gray16やRgb48では16ビット全体を輝度データとして用いる事は少なく、16ビット中の下位10ビット、12ビットなどに値を入れている事が多いのですが、この16ビット中の何ビットが有効か?を設定するのがSystem.Windows.Media.PixelFormat構造体のMasksプロパティっぽいのですが、このMasksプロパティは読み取り専用で設定が出来ない!

そのため、データとして、16ビット全体が有効(65536諧調もっている)であればいいのですが、そうでない場合、結局、どうしたらよいのか?分かりませんでした。。

 

ちなみにGray16、Bgr101010に関しては、有効ビットを設定するのにWin32APIのビットフィールドという機能を用いれば設定が可能です。

(参考)多ビット(10Bit、12Bit)画像データの表示、フォーマット

https://imagingsolution.net/imaging/imaging-programing/10bit-image-format/

 

※まだ、WPFを理解しきれていない部分が多いので、間違い等ありましたら、コメント頂けると幸いです。

Microsoft Cognitive Toolkit Ver2.6が公開されました

変更の概要についてはこちら↓
https://docs.microsoft.com/en-us/cognitive-toolkit/releasenotes/cntk_2_6_release_notes

 

以前のバージョン(Ver2.5.1)ではVisual Studio 2015からも実行できたのですが、今回のVer2.6ではVisual Studio 2017でないとNuGetよりインストールできませんでした。

さらにVisual Studio 2017も更新しないとダメでした。。

 

今回のバージョンのでは.NET の変更もあるということで、とりあえずCNTK.CNTKLibの定義をWinMergeを使って比較してみました。

(詳細についてそのうち。。)

 

Ver2.6 Ver2.5.1
       public CNTKLib();        public CNTKLib();
       public static bool AreEqual(Axis first, Axis second);        public static bool AreEqual(Axis first, Axis second);
       public static bool AreEqual(DeviceDescriptor first, DeviceDescriptor second);        public static bool AreEqual(DeviceDescriptor first, DeviceDescriptor second);
       public static bool AreEqual(NDShape first, NDShape second);        public static bool AreEqual(NDShape first, NDShape second);
       public static bool AreEqual(Variable first, Variable second);        public static bool AreEqual(Variable first, Variable second);
       public static bool AreNotEqual(Axis first, Axis second);        public static bool AreNotEqual(Axis first, Axis second);
       public static bool AreNotEqual(DeviceDescriptor left, DeviceDescriptor right);        public static bool AreNotEqual(DeviceDescriptor left, DeviceDescriptor right);
       public static bool AreNotEqual(NDShape first, NDShape second);        public static bool AreNotEqual(NDShape first, NDShape second);
       public static bool AreNotEqual(Variable first, Variable second);        public static bool AreNotEqual(Variable first, Variable second);
       public static bool IsRandomSeedFixed();        public static bool IsRandomSeedFixed();
       public static bool IsSparseStorageFormat(StorageFormat storageFormat);        public static bool IsSparseStorageFormat(StorageFormat storageFormat);
.        public static bool ShouldForceDeterministicAlgorithms();  
       public static bool ShouldUseSparseGradientAggregationInDataParallelSGD();        public static bool ShouldUseSparseGradientAggregationInDataParallelSGD();
       public static CNTKDictionary Base64ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName);        public static CNTKDictionary Base64ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName);
       public static CNTKDictionary Base64ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, DictionaryVector transforms);        public static CNTKDictionary Base64ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, DictionaryVector transforms);
       public static CNTKDictionary BilinearInitializer(uint kernelWidth, uint kernelHeight);        public static CNTKDictionary BilinearInitializer(uint kernelWidth, uint kernelHeight);
       public static CNTKDictionary CBFDeserializer(string fileName);        public static CNTKDictionary CBFDeserializer(string fileName);
       public static CNTKDictionary CBFDeserializer(string fileName, StreamConfigurationVector streams);        public static CNTKDictionary CBFDeserializer(string fileName, StreamConfigurationVector streams);
       public static CNTKDictionary ConstantInitializer();        public static CNTKDictionary ConstantInitializer();
       public static CNTKDictionary ConstantInitializer(double value);        public static CNTKDictionary ConstantInitializer(double value);
       public static CNTKDictionary CTFDeserializer(string fileName, StreamConfigurationVector streams);        public static CNTKDictionary CTFDeserializer(string fileName, StreamConfigurationVector streams);
       public static CNTKDictionary GlorotNormalInitializer();        public static CNTKDictionary GlorotNormalInitializer();
       public static CNTKDictionary GlorotNormalInitializer(double scale);        public static CNTKDictionary GlorotNormalInitializer(double scale);
       public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank);        public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank);
       public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary GlorotNormalInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static CNTKDictionary GlorotUniformInitializer();        public static CNTKDictionary GlorotUniformInitializer();
       public static CNTKDictionary GlorotUniformInitializer(double scale);        public static CNTKDictionary GlorotUniformInitializer(double scale);
       public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank);        public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank);
       public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary GlorotUniformInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static CNTKDictionary HeNormalInitializer();        public static CNTKDictionary HeNormalInitializer();
       public static CNTKDictionary HeNormalInitializer(double scale);        public static CNTKDictionary HeNormalInitializer(double scale);
       public static CNTKDictionary HeNormalInitializer(double scale, int outputRank);        public static CNTKDictionary HeNormalInitializer(double scale, int outputRank);
       public static CNTKDictionary HeNormalInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary HeNormalInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary HeNormalInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary HeNormalInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static CNTKDictionary HeUniformInitializer();        public static CNTKDictionary HeUniformInitializer();
       public static CNTKDictionary HeUniformInitializer(double scale);        public static CNTKDictionary HeUniformInitializer(double scale);
       public static CNTKDictionary HeUniformInitializer(double scale, int outputRank);        public static CNTKDictionary HeUniformInitializer(double scale, int outputRank);
       public static CNTKDictionary HeUniformInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary HeUniformInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary HeUniformInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary HeUniformInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static CNTKDictionary HTKFeatureDeserializer(HTKFeatureConfigurationVector streams);        public static CNTKDictionary HTKFeatureDeserializer(HTKFeatureConfigurationVector streams);
       public static CNTKDictionary HTKMLFDeserializer(string streamName, string labelMappingFile, uint dimension, StringVector mlfFiles);        public static CNTKDictionary HTKMLFDeserializer(string streamName, string labelMappingFile, uint dimension, StringVector mlfFiles);
       public static CNTKDictionary HTKMLFDeserializer(string streamName, string labelMappingFile, uint dimension, StringVector mlfFiles, bool phoneBoundaries);        public static CNTKDictionary HTKMLFDeserializer(string streamName, string labelMappingFile, uint dimension, StringVector mlfFiles, bool phoneBoundaries);
       public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName);        public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName);
       public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, DictionaryVector transforms);        public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, DictionaryVector transforms);
       public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, IList<CNTKDictionary> deserializers);        public static CNTKDictionary ImageDeserializer(string fileName, string labelStreamName, uint numLabels, string imageStreamName, IList<CNTKDictionary> deserializers);
       public static CNTKDictionary LatticeDeserializer(string streamName, string latticeIndexFile);        public static CNTKDictionary LatticeDeserializer(string streamName, string latticeIndexFile);
       public static CNTKDictionary NormalInitializer(double scale);        public static CNTKDictionary NormalInitializer(double scale);
       public static CNTKDictionary NormalInitializer(double scale, int outputRank);        public static CNTKDictionary NormalInitializer(double scale, int outputRank);
       public static CNTKDictionary NormalInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary NormalInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary NormalInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary NormalInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static CNTKDictionary RandomInitializerWithRank(CNTKDictionary initializer, int outputRank, int filterRank);        public static CNTKDictionary RandomInitializerWithRank(CNTKDictionary initializer, int outputRank, int filterRank);
       public static CNTKDictionary ReaderColor();        public static CNTKDictionary ReaderColor();
       public static CNTKDictionary ReaderColor(float brightnessRadius);        public static CNTKDictionary ReaderColor(float brightnessRadius);
       public static CNTKDictionary ReaderColor(float brightnessRadius, float contrastRadius);        public static CNTKDictionary ReaderColor(float brightnessRadius, float contrastRadius);
       public static CNTKDictionary ReaderColor(float brightnessRadius, float contrastRadius, float saturationRadius);        public static CNTKDictionary ReaderColor(float brightnessRadius, float contrastRadius, float saturationRadius);
       public static CNTKDictionary ReaderCrop();        public static CNTKDictionary ReaderCrop();
       public static CNTKDictionary ReaderCrop(string cropType);        public static CNTKDictionary ReaderCrop(string cropType);
       public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize);        public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize);
       public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio);        public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio);
       public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio);        public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio);
       public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio, PairFloatFloat aspectRatio);        public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio, PairFloatFloat aspectRatio);
       public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio, PairFloatFloat aspectRatio, string jitterType);        public static CNTKDictionary ReaderCrop(string cropType, PairIntInt cropSize, PairFloatFloat sideRatio, PairFloatFloat areaRatio, PairFloatFloat aspectRatio, string jitterType);
       public static CNTKDictionary ReaderCrop(string cropType, Tuple<int, int> cropSize, Tuple<float, float> sideRatio, Tuple<float, float> areaRatio, Tuple<float, float> aspectRatio, string jitterType);        public static CNTKDictionary ReaderCrop(string cropType, Tuple<int, int> cropSize, Tuple<float, float> sideRatio, Tuple<float, float> areaRatio, Tuple<float, float> aspectRatio, string jitterType);
       public static CNTKDictionary ReaderMean(string meanFile);        public static CNTKDictionary ReaderMean(string meanFile);
       public static CNTKDictionary ReaderScale(int width, int height, int channels);        public static CNTKDictionary ReaderScale(int width, int height, int channels);
       public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations);        public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations);
       public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations, string scaleMode);        public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations, string scaleMode);
       public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations, string scaleMode, int padValue);        public static CNTKDictionary ReaderScale(int width, int height, int channels, string interpolations, string scaleMode, int padValue);
       public static CNTKDictionary TruncatedNormalInitializer();        public static CNTKDictionary TruncatedNormalInitializer();
       public static CNTKDictionary TruncatedNormalInitializer(double scale);        public static CNTKDictionary TruncatedNormalInitializer(double scale);
       public static CNTKDictionary TruncatedNormalInitializer(double scale, uint seed);        public static CNTKDictionary TruncatedNormalInitializer(double scale, uint seed);
       public static CNTKDictionary UniformInitializer(double scale);        public static CNTKDictionary UniformInitializer(double scale);
       public static CNTKDictionary UniformInitializer(double scale, uint seed);        public static CNTKDictionary UniformInitializer(double scale, uint seed);
       public static CNTKDictionary XavierInitializer();        public static CNTKDictionary XavierInitializer();
       public static CNTKDictionary XavierInitializer(double scale);        public static CNTKDictionary XavierInitializer(double scale);
       public static CNTKDictionary XavierInitializer(double scale, int outputRank);        public static CNTKDictionary XavierInitializer(double scale, int outputRank);
       public static CNTKDictionary XavierInitializer(double scale, int outputRank, int filterRank);        public static CNTKDictionary XavierInitializer(double scale, int outputRank, int filterRank);
       public static CNTKDictionary XavierInitializer(double scale, int outputRank, int filterRank, uint seed);        public static CNTKDictionary XavierInitializer(double scale, int outputRank, int filterRank, uint seed);
       public static double MomentumFromTimeConstant(double momTC);        public static double MomentumFromTimeConstant(double momTC);
       public static Evaluator CreateEvaluator(Function evaluationFunction);        public static Evaluator CreateEvaluator(Function evaluationFunction);
       public static Evaluator CreateEvaluator(Function evaluationFunction, ProgressWriterVector progressWriters);        public static Evaluator CreateEvaluator(Function evaluationFunction, ProgressWriterVector progressWriters);
       public static Function Abs(Variable operand);        public static Function Abs(Variable operand);
       public static Function Abs(Variable operand, string name);        public static Function Abs(Variable operand, string name);
       public static Function Acos(Variable operand);        public static Function Acos(Variable operand);
       public static Function Acos(Variable operand, string name);        public static Function Acos(Variable operand, string name);
       public static Function Alias(Variable operand);        public static Function Alias(Variable operand);
       public static Function Alias(Variable operand, string name);        public static Function Alias(Variable operand, string name);
       public static Function Argmax(Variable operand, Axis axis);        public static Function Argmax(Variable operand, Axis axis);
       public static Function Argmax(Variable operand, Axis axis, string name);        public static Function Argmax(Variable operand, Axis axis, string name);
       public static Function Argmin(Variable operand, Axis axis);        public static Function Argmin(Variable operand, Axis axis);
       public static Function Argmin(Variable operand, Axis axis, string name);        public static Function Argmin(Variable operand, Axis axis, string name);
       public static Function AsComposite(Function rootFunction);        public static Function AsComposite(Function rootFunction);
       public static Function AsComposite(Function rootFunction, string name);        public static Function AsComposite(Function rootFunction, string name);
       public static Function Asin(Variable operand);        public static Function Asin(Variable operand);
       public static Function Asin(Variable operand, string name);        public static Function Asin(Variable operand, string name);
       public static Function Asinh(Variable operand);        public static Function Asinh(Variable operand);
       public static Function Asinh(Variable operand, string name);        public static Function Asinh(Variable operand, string name);
       public static Function Assign(Variable arg0, Variable operand);        public static Function Assign(Variable arg0, Variable operand);
       public static Function Assign(Variable arg0, Variable operand, string name);        public static Function Assign(Variable arg0, Variable operand, string name);
.        public static Function Atan(Variable operand);  
       public static Function Atan(Variable operand, string name);  
       public static Function Atanh(Variable operand);        public static Function Atanh(Variable operand);
       public static Function Atanh(Variable operand, string name);        public static Function Atanh(Variable operand, string name);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine, bool disableRegularization);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine, bool disableRegularization);
       public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine, bool disableRegularization, string name);        public static Function BatchNormalization(Variable operand, Variable scale, Variable bias, Variable runningMean, Variable runningInvStd, Variable runningCount, bool spatial, double normalizationTimeConstant, double blendTimeConstant, double epsilon, bool useCuDNNEngine, bool disableRegularization, string name);
       public static Function BernoulliRandom(NDShape shape, DataType dataType);        public static Function BernoulliRandom(NDShape shape, DataType dataType);
       public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean);        public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean);
       public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean, uint seed);        public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean, uint seed);
       public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean, uint seed, string name);        public static Function BernoulliRandom(NDShape shape, DataType dataType, double mean, uint seed, string name);
       public static Function BernoulliRandomLike(Variable operand);        public static Function BernoulliRandomLike(Variable operand);
       public static Function BernoulliRandomLike(Variable operand, double mean);        public static Function BernoulliRandomLike(Variable operand, double mean);
       public static Function BernoulliRandomLike(Variable operand, double mean, uint seed);        public static Function BernoulliRandomLike(Variable operand, double mean, uint seed);
       public static Function BernoulliRandomLike(Variable operand, double mean, uint seed, string name);        public static Function BernoulliRandomLike(Variable operand, double mean, uint seed, string name);
       public static Function BinaryCrossEntropy(Variable prediction, Variable targets);        public static Function BinaryCrossEntropy(Variable prediction, Variable targets);
       public static Function BinaryCrossEntropy(Variable prediction, Variable targets, string name);        public static Function BinaryCrossEntropy(Variable prediction, Variable targets, string name);
       public static Function Cast(Variable nodeInput, DataType outputType);        public static Function Cast(Variable nodeInput, DataType outputType);
       public static Function Cast(Variable nodeInput, DataType outputType, string name);        public static Function Cast(Variable nodeInput, DataType outputType, string name);
       public static Function Ceil(Variable operand);        public static Function Ceil(Variable operand);
       public static Function Ceil(Variable operand, string name);        public static Function Ceil(Variable operand, string name);
       public static Function ClassificationError(Variable prediction, Variable labels);        public static Function ClassificationError(Variable prediction, Variable labels);
       public static Function ClassificationError(Variable prediction, Variable labels, Axis axis);        public static Function ClassificationError(Variable prediction, Variable labels, Axis axis);
       public static Function ClassificationError(Variable prediction, Variable labels, Axis axis, string name);        public static Function ClassificationError(Variable prediction, Variable labels, Axis axis, string name);
       public static Function ClassificationError(Variable prediction, Variable labels, string name);        public static Function ClassificationError(Variable prediction, Variable labels, string name);
       public static Function ClassificationError(Variable prediction, Variable labels, uint topN);        public static Function ClassificationError(Variable prediction, Variable labels, uint topN);
       public static Function ClassificationError(Variable prediction, Variable labels, uint topN, Axis axis);        public static Function ClassificationError(Variable prediction, Variable labels, uint topN, Axis axis);
       public static Function ClassificationError(Variable prediction, Variable labels, uint topN, Axis axis, string name);        public static Function ClassificationError(Variable prediction, Variable labels, uint topN, Axis axis, string name);
       public static Function ClassificationError(Variable prediction, Variable labels, uint topN, string name);        public static Function ClassificationError(Variable prediction, Variable labels, uint topN, string name);
       public static Function Clip(Variable operand, Variable min, Variable max);        public static Function Clip(Variable operand, Variable min, Variable max);
       public static Function Clip(Variable operand, Variable min, Variable max, string name);        public static Function Clip(Variable operand, Variable min, Variable max, string name);
       public static Function Combine(VariableVector operands);        public static Function Combine(VariableVector operands);
       public static Function Combine(VariableVector operands, string name);        public static Function Combine(VariableVector operands, string name);
       public static Function Convolution(Variable convolutionMap, Variable operand);        public static Function Convolution(Variable convolutionMap, Variable operand);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups, uint maxTempMemSizeInSamples);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups, uint maxTempMemSizeInSamples);
.        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups, uint maxTempMemSizeInSamples, bool sequential);         public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups, uint maxTempMemSizeInSamples, string name);
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint reductionRank, uint groups, uint maxTempMemSizeInSamples, bool sequential, string name);  
       public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, IEnumerable<bool> sharing, IEnumerable<bool> autoPadding);        public static Function Convolution(Variable convolutionMap, Variable operand, NDShape strides, IEnumerable<bool> sharing, IEnumerable<bool> autoPadding);
.        public static Function ConvolutionSequenceShape(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, bool transpose, NDShape outputShape, uint groups, uint maxTempMemSizeInSamples);  
       public static Function ConvolutionSequenceShape(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, bool transpose, NDShape outputShape, uint groups, uint maxTempMemSizeInSamples, string name);  
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank, uint maxTempMemSizeInSamples);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank, uint maxTempMemSizeInSamples);
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank, uint maxTempMemSizeInSamples, string name);        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape outputShape, NDShape dilation, uint reductionRank, uint maxTempMemSizeInSamples, string name);
.        public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, SizeTVector lowerPad, SizeTVector upperPad, NDShape outputShape, NDShape dilation, uint maxTempMemSizeInSamples);  
       public static Function ConvolutionTranspose(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, SizeTVector lowerPad, SizeTVector upperPad, NDShape outputShape, NDShape dilation, uint maxTempMemSizeInSamples, string name);  
       public static Function Cos(Variable operand);        public static Function Cos(Variable operand);
       public static Function Cos(Variable operand, string name);        public static Function Cos(Variable operand, string name);
       public static Function Cosh(Variable operand);        public static Function Cosh(Variable operand);
       public static Function Cosh(Variable operand, string name);        public static Function Cosh(Variable operand, string name);
       public static Function CosineDistance(Variable leftOperand, Variable rightOperand);        public static Function CosineDistance(Variable leftOperand, Variable rightOperand);
       public static Function CosineDistance(Variable leftOperand, Variable rightOperand, string name);        public static Function CosineDistance(Variable leftOperand, Variable rightOperand, string name);
       public static Function CosineDistanceWithNegativeSamples(Variable leftOperand, Variable rightOperand, uint shiftWindow, uint numberOfNegativeSamples);        public static Function CosineDistanceWithNegativeSamples(Variable leftOperand, Variable rightOperand, uint shiftWindow, uint numberOfNegativeSamples);
       public static Function CosineDistanceWithNegativeSamples(Variable leftOperand, Variable rightOperand, uint shiftWindow, uint numberOfNegativeSamples, string name);        public static Function CosineDistanceWithNegativeSamples(Variable leftOperand, Variable rightOperand, uint shiftWindow, uint numberOfNegativeSamples, string name);
       public static Function Crop(Variable nodeInput, Variable nodeReferent);        public static Function Crop(Variable nodeInput, Variable nodeReferent);
       public static Function Crop(Variable nodeInput, Variable nodeReferent, string name);        public static Function Crop(Variable nodeInput, Variable nodeReferent, string name);
       public static Function Crop(Variable nodeInput, Variable nodeReferent, uint offsetX, uint offsetY);        public static Function Crop(Variable nodeInput, Variable nodeReferent, uint offsetX, uint offsetY);
       public static Function Crop(Variable nodeInput, Variable nodeReferent, uint offsetX, uint offsetY, string name);        public static Function Crop(Variable nodeInput, Variable nodeReferent, uint offsetX, uint offsetY, string name);
       public static Function Crop(Variable nodeInput, Variable nodeReferent, Variable ancestorInput, Variable ancestorReferent);        public static Function Crop(Variable nodeInput, Variable nodeReferent, Variable ancestorInput, Variable ancestorReferent);
       public static Function Crop(Variable nodeInput, Variable nodeReferent, Variable ancestorInput, Variable ancestorReferent, string name);        public static Function Crop(Variable nodeInput, Variable nodeReferent, Variable ancestorInput, Variable ancestorReferent, string name);
       public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels);        public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels);
       public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, Axis axis);        public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, Axis axis);
       public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, Axis axis, string name);        public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, Axis axis, string name);
       public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, string name);        public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, string name);
.        public static Function CustomProxyOp(VariableVector operands, string customOp, NDShape outputShape, DataType outputType);  
       public static Function CustomProxyOp(VariableVector operands, string customOp, NDShape outputShape, DataType outputType, string name);  
       public static Function DepthToSpace(Variable operand, uint blockSize);        public static Function DepthToSpace(Variable operand, uint blockSize);
       public static Function DepthToSpace(Variable operand, uint blockSize, string name);        public static Function DepthToSpace(Variable operand, uint blockSize, string name);
       public static Function Dropout(Variable operand, double dropoutRate);        public static Function Dropout(Variable operand, double dropoutRate);
       public static Function Dropout(Variable operand, double dropoutRate, uint seed);        public static Function Dropout(Variable operand, double dropoutRate, uint seed);
       public static Function Dropout(Variable operand, double dropoutRate, uint seed, string name);        public static Function Dropout(Variable operand, double dropoutRate, uint seed, string name);
       public static Function EditDistanceError(Variable prediction, Variable labels, float substitutionPenalty, float deletionPenalty, float insertionPenalty, bool squashInputs, SizeTVector tokensToIgnore);        public static Function EditDistanceError(Variable prediction, Variable labels, float substitutionPenalty, float deletionPenalty, float insertionPenalty, bool squashInputs, SizeTVector tokensToIgnore);
       public static Function EditDistanceError(Variable prediction, Variable labels, float substitutionPenalty, float deletionPenalty, float insertionPenalty, bool squashInputs, SizeTVector tokensToIgnore, string name);        public static Function EditDistanceError(Variable prediction, Variable labels, float substitutionPenalty, float deletionPenalty, float insertionPenalty, bool squashInputs, SizeTVector tokensToIgnore, string name);
       public static Function ElementAnd(Variable leftOperand, Variable rightOperand);        public static Function ElementAnd(Variable leftOperand, Variable rightOperand);
       public static Function ElementAnd(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementAnd(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementDivide(Variable leftOperand, Variable rightOperand);        public static Function ElementDivide(Variable leftOperand, Variable rightOperand);
       public static Function ElementDivide(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementDivide(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementMax(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementMax(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementMin(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementMin(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementNot(Variable operand);        public static Function ElementNot(Variable operand);
       public static Function ElementNot(Variable operand, string name);        public static Function ElementNot(Variable operand, string name);
       public static Function ElementOr(Variable leftOperand, Variable rightOperand);        public static Function ElementOr(Variable leftOperand, Variable rightOperand);
       public static Function ElementOr(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementOr(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementSelect(Variable condition, Variable thenOperand, Variable elseOperand);        public static Function ElementSelect(Variable condition, Variable thenOperand, Variable elseOperand);
       public static Function ElementSelect(Variable condition, Variable thenOperand, Variable elseOperand, string name);        public static Function ElementSelect(Variable condition, Variable thenOperand, Variable elseOperand, string name);
       public static Function ElementTimes(Variable leftOperand, Variable rightOperand);        public static Function ElementTimes(Variable leftOperand, Variable rightOperand);
       public static Function ElementTimes(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementTimes(Variable leftOperand, Variable rightOperand, string name);
       public static Function ElementXor(Variable leftOperand, Variable rightOperand);        public static Function ElementXor(Variable leftOperand, Variable rightOperand);
       public static Function ElementXor(Variable leftOperand, Variable rightOperand, string name);        public static Function ElementXor(Variable leftOperand, Variable rightOperand, string name);
       public static Function ELU(Variable operand);        public static Function ELU(Variable operand);
.        public static Function ELU(Variable operand, double alpha);  
       public static Function ELU(Variable operand, double alpha, string name);  
       public static Function ELU(Variable operand, string name);        public static Function ELU(Variable operand, string name);
       public static Function Equal(Variable leftOperand, Variable rightOperand);        public static Function Equal(Variable leftOperand, Variable rightOperand);
       public static Function Equal(Variable leftOperand, Variable rightOperand, string name);        public static Function Equal(Variable leftOperand, Variable rightOperand, string name);
       public static Function Exp(Variable operand);        public static Function Exp(Variable operand);
       public static Function Exp(Variable operand, string name);        public static Function Exp(Variable operand, string name);
       public static Function ExpandDims(Variable operand, Axis axis);        public static Function ExpandDims(Variable operand, Axis axis);
       public static Function ExpandDims(Variable operand, Axis axis, string name);        public static Function ExpandDims(Variable operand, Axis axis, string name);
.        public static Function EyeLike(Variable operand, bool isOutputSparse);  
       public static Function EyeLike(Variable operand, bool isOutputSparse, string name);  
       public static Function Flatten(Variable operand);        public static Function Flatten(Variable operand);
       public static Function Flatten(Variable operand, Axis axis);        public static Function Flatten(Variable operand, Axis axis);
       public static Function Flatten(Variable operand, Axis axis, string name);        public static Function Flatten(Variable operand, Axis axis, string name);
       public static Function Flatten(Variable operand, string name);        public static Function Flatten(Variable operand, string name);
       public static Function Floor(Variable operand);        public static Function Floor(Variable operand);
       public static Function Floor(Variable operand, string name);        public static Function Floor(Variable operand, string name);
       public static Function ForwardBackward(Variable graph, Variable features, uint blankTokenId, int delayConstraint);        public static Function ForwardBackward(Variable graph, Variable features, uint blankTokenId, int delayConstraint);
       public static Function ForwardBackward(Variable graph, Variable features, uint blankTokenId, int delayConstraint, string name);        public static Function ForwardBackward(Variable graph, Variable features, uint blankTokenId, int delayConstraint, string name);
       public static Function FutureValue(Variable operand);        public static Function FutureValue(Variable operand);
       public static Function FutureValue(Variable operand, uint offset);        public static Function FutureValue(Variable operand, uint offset);
       public static Function FutureValue(Variable operand, uint offset, string name);        public static Function FutureValue(Variable operand, uint offset, string name);
       public static Function FutureValue(Variable operand, Variable initialState);        public static Function FutureValue(Variable operand, Variable initialState);
       public static Function FutureValue(Variable operand, Variable initialState, uint offset);        public static Function FutureValue(Variable operand, Variable initialState, uint offset);
       public static Function FutureValue(Variable operand, Variable initialState, uint offset, string name);        public static Function FutureValue(Variable operand, Variable initialState, uint offset, string name);
       public static Function GatherOp(Variable indices, Variable reference);        public static Function GatherOp(Variable indices, Variable reference);
       public static Function GatherOp(Variable indices, Variable reference, Axis axis);        public static Function GatherOp(Variable indices, Variable reference, Axis axis);
       public static Function GatherOp(Variable indices, Variable reference, Axis axis, string name);        public static Function GatherOp(Variable indices, Variable reference, Axis axis, string name);
       public static Function GatherOp(Variable indices, Variable reference, string name);        public static Function GatherOp(Variable indices, Variable reference, string name);
.        public static Function Gemm(Variable operandA, Variable operandB, Variable operandC);  
       public static Function Gemm(Variable operandA, Variable operandB, Variable operandC, float alpha);  
       public static Function Gemm(Variable operandA, Variable operandB, Variable operandC, float alpha, float beta);  
       public static Function Gemm(Variable operandA, Variable operandB, Variable operandC, float alpha, float beta, bool transA);  
       public static Function Gemm(Variable operandA, Variable operandB, Variable operandC, float alpha, float beta, bool transA, bool transB);  
       public static Function Gemm(Variable operandA, Variable operandB, Variable operandC, float alpha, float beta, bool transA, bool transB, string name);  
       public static Function Greater(Variable leftOperand, Variable rightOperand);        public static Function Greater(Variable leftOperand, Variable rightOperand);
       public static Function Greater(Variable leftOperand, Variable rightOperand, string name);        public static Function Greater(Variable leftOperand, Variable rightOperand, string name);
       public static Function GreaterEqual(Variable leftOperand, Variable rightOperand);        public static Function GreaterEqual(Variable leftOperand, Variable rightOperand);
       public static Function GreaterEqual(Variable leftOperand, Variable rightOperand, string name);        public static Function GreaterEqual(Variable leftOperand, Variable rightOperand, string name);
.          public static Function GroupConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint groups, uint maxTempMemSizeInSamples);
         public static Function GroupConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint groups, uint maxTempMemSizeInSamples, string name);
       public static Function GumbelRandom(NDShape shape, DataType dataType);        public static Function GumbelRandom(NDShape shape, DataType dataType);
       public static Function GumbelRandom(NDShape shape, DataType dataType, double loc);        public static Function GumbelRandom(NDShape shape, DataType dataType, double loc);
       public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale);        public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale);
       public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale, uint seed);        public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale, uint seed);
       public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale, uint seed, string name);        public static Function GumbelRandom(NDShape shape, DataType dataType, double loc, double scale, uint seed, string name);
       public static Function GumbelRandomLike(Variable operand);        public static Function GumbelRandomLike(Variable operand);
       public static Function GumbelRandomLike(Variable operand, double loc);        public static Function GumbelRandomLike(Variable operand, double loc);
       public static Function GumbelRandomLike(Variable operand, double loc, double scale);        public static Function GumbelRandomLike(Variable operand, double loc, double scale);
       public static Function GumbelRandomLike(Variable operand, double loc, double scale, uint seed);        public static Function GumbelRandomLike(Variable operand, double loc, double scale, uint seed);
       public static Function GumbelRandomLike(Variable operand, double loc, double scale, uint seed, string name);        public static Function GumbelRandomLike(Variable operand, double loc, double scale, uint seed, string name);
       public static Function Hardmax(Variable operand);        public static Function Hardmax(Variable operand);
       public static Function Hardmax(Variable operand, string name);        public static Function Hardmax(Variable operand, string name);
       public static Function HardSigmoid(Variable operand, float alpha, float beta);        public static Function HardSigmoid(Variable operand, float alpha, float beta);
       public static Function HardSigmoid(Variable operand, float alpha, float beta, string name);        public static Function HardSigmoid(Variable operand, float alpha, float beta, string name);
       public static Function ImageScaler(Variable operand, float scaler, FloatVector biases, string name);        public static Function ImageScaler(Variable operand, float scaler, FloatVector biases, string name);
       public static Function LabelsToGraph(Variable labels);        public static Function LabelsToGraph(Variable labels);
       public static Function LabelsToGraph(Variable labels, string name);        public static Function LabelsToGraph(Variable labels, string name);
       public static Function LambdaRank(Variable prediction, Variable gains, Variable groupId);        public static Function LambdaRank(Variable prediction, Variable gains, Variable groupId);
       public static Function LambdaRank(Variable prediction, Variable gains, Variable groupId, string name);        public static Function LambdaRank(Variable prediction, Variable gains, Variable groupId, string name);
       public static Function LatticeSequenceWithSoftmax(Variable labels, Variable prediction, Variable scaledLogLikelihood, Variable lattice, string symbolListPath, string phonePath, string stateListPath, string transitionProbabilityPath, string configFilePath, float smoothingWeight, float frameDropThreshold, bool doReferenceAlign, bool gammarUsesMBR, float gammarAMF, float gammarLMF, float gammarBMMIFactor, float gammarWordPenalty);        public static Function LatticeSequenceWithSoftmax(Variable labels, Variable prediction, Variable scaledLogLikelihood, Variable lattice, string symbolListPath, string phonePath, string stateListPath, string transitionProbabilityPath, string configFilePath, float smoothingWeight, float frameDropThreshold, bool doReferenceAlign, bool gammarUsesMBR, float gammarAMF, float gammarLMF, float gammarBMMIFactor, float gammarWordPenalty);
       public static Function LatticeSequenceWithSoftmax(Variable labels, Variable prediction, Variable scaledLogLikelihood, Variable lattice, string symbolListPath, string phonePath, string stateListPath, string transitionProbabilityPath, string configFilePath, float smoothingWeight, float frameDropThreshold, bool doReferenceAlign, bool gammarUsesMBR, float gammarAMF, float gammarLMF, float gammarBMMIFactor, float gammarWordPenalty, string name);        public static Function LatticeSequenceWithSoftmax(Variable labels, Variable prediction, Variable scaledLogLikelihood, Variable lattice, string symbolListPath, string phonePath, string stateListPath, string transitionProbabilityPath, string configFilePath, float smoothingWeight, float frameDropThreshold, bool doReferenceAlign, bool gammarUsesMBR, float gammarAMF, float gammarLMF, float gammarBMMIFactor, float gammarWordPenalty, string name);
       public static Function LeakyReLU(Variable operand, double alpha);        public static Function LeakyReLU(Variable operand, double alpha);
       public static Function LeakyReLU(Variable operand, double alpha, string name);        public static Function LeakyReLU(Variable operand, double alpha, string name);
       public static Function Less(Variable leftOperand, Variable rightOperand);        public static Function Less(Variable leftOperand, Variable rightOperand);
       public static Function Less(Variable leftOperand, Variable rightOperand, string name);        public static Function Less(Variable leftOperand, Variable rightOperand, string name);
       public static Function LessEqual(Variable leftOperand, Variable rightOperand);        public static Function LessEqual(Variable leftOperand, Variable rightOperand);
       public static Function LessEqual(Variable leftOperand, Variable rightOperand, string name);        public static Function LessEqual(Variable leftOperand, Variable rightOperand, string name);
       public static Function LocalResponseNormalization(Variable operand, uint depthRadius, double bias, double alpha, double beta);        public static Function LocalResponseNormalization(Variable operand, uint depthRadius, double bias, double alpha, double beta);
       public static Function LocalResponseNormalization(Variable operand, uint depthRadius, double bias, double alpha, double beta, string name);        public static Function LocalResponseNormalization(Variable operand, uint depthRadius, double bias, double alpha, double beta, string name);
       public static Function Log(Variable operand);        public static Function Log(Variable operand);
       public static Function Log(Variable operand, string name);        public static Function Log(Variable operand, string name);
       public static Function LogAddExp(Variable leftOperand, Variable rightOperand);        public static Function LogAddExp(Variable leftOperand, Variable rightOperand);
       public static Function LogAddExp(Variable leftOperand, Variable rightOperand, string name);        public static Function LogAddExp(Variable leftOperand, Variable rightOperand, string name);
       public static Function LogSoftmax(Variable operand);        public static Function LogSoftmax(Variable operand);
       public static Function LogSoftmax(Variable operand, Axis axis);        public static Function LogSoftmax(Variable operand, Axis axis);
       public static Function LogSoftmax(Variable operand, Axis axis, string name);        public static Function LogSoftmax(Variable operand, Axis axis, string name);
       public static Function LogSoftmax(Variable operand, string name);        public static Function LogSoftmax(Variable operand, string name);
.        public static Function MatMul(Variable leftOperand, Variable rightOperand);  
       public static Function MatMul(Variable leftOperand, Variable rightOperand, string name);  
       public static Function Mean(VariableVector operands);        public static Function Mean(VariableVector operands);
       public static Function Mean(VariableVector operands, string name);        public static Function Mean(VariableVector operands, string name);
       public static Function MeanVarianceNormalization(Variable operand);        public static Function MeanVarianceNormalization(Variable operand);
       public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels);        public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels);
       public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels, bool doVarianceScaling);        public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels, bool doVarianceScaling);
       public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels, bool doVarianceScaling, string name);        public static Function MeanVarianceNormalization(Variable operand, bool useStatsAcrossChannels, bool doVarianceScaling, string name);
       public static Function MeanVarianceNormalization(Variable operand, double epsilon);        public static Function MeanVarianceNormalization(Variable operand, double epsilon);
       public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels);        public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels);
       public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels, bool doVarianceScaling);        public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels, bool doVarianceScaling);
       public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels, bool doVarianceScaling, string name);        public static Function MeanVarianceNormalization(Variable operand, double epsilon, bool useStatsAcrossChannels, bool doVarianceScaling, string name);
       public static Function Minus(Variable leftOperand, Variable rightOperand);        public static Function Minus(Variable leftOperand, Variable rightOperand);
       public static Function Minus(Variable leftOperand, Variable rightOperand, string name);        public static Function Minus(Variable leftOperand, Variable rightOperand, string name);
       public static Function NDCGAt1(Variable prediction, Variable gains, Variable groupId);        public static Function NDCGAt1(Variable prediction, Variable gains, Variable groupId);
       public static Function NDCGAt1(Variable prediction, Variable gains, Variable groupId, string name);        public static Function NDCGAt1(Variable prediction, Variable gains, Variable groupId, string name);
       public static Function Negate(Variable operand);        public static Function Negate(Variable operand);
       public static Function Negate(Variable operand, string name);        public static Function Negate(Variable operand, string name);
       public static Function NormalRandom(NDShape shape, DataType dataType);        public static Function NormalRandom(NDShape shape, DataType dataType);
       public static Function NormalRandom(NDShape shape, DataType dataType, double mean);        public static Function NormalRandom(NDShape shape, DataType dataType, double mean);
       public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale);        public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale);
       public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale, uint seed);        public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale, uint seed);
       public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale, uint seed, string name);        public static Function NormalRandom(NDShape shape, DataType dataType, double mean, double scale, uint seed, string name);
       public static Function NormalRandomLike(Variable operand);        public static Function NormalRandomLike(Variable operand);
       public static Function NormalRandomLike(Variable operand, double mean);        public static Function NormalRandomLike(Variable operand, double mean);
       public static Function NormalRandomLike(Variable operand, double mean, double scale);        public static Function NormalRandomLike(Variable operand, double mean, double scale);
       public static Function NormalRandomLike(Variable operand, double mean, double scale, uint seed);        public static Function NormalRandomLike(Variable operand, double mean, double scale, uint seed);
       public static Function NormalRandomLike(Variable operand, double mean, double scale, uint seed, string name);        public static Function NormalRandomLike(Variable operand, double mean, double scale, uint seed, string name);
       public static Function NotEqual(Variable leftOperand, Variable rightOperand);        public static Function NotEqual(Variable leftOperand, Variable rightOperand);
       public static Function NotEqual(Variable leftOperand, Variable rightOperand, string name);        public static Function NotEqual(Variable leftOperand, Variable rightOperand, string name);
       public static Function OneHotOp(Variable operand, uint numClass, bool outputSparse, Axis axis);        public static Function OneHotOp(Variable operand, uint numClass, bool outputSparse, Axis axis);
       public static Function OneHotOp(Variable operand, uint numClass, bool outputSparse, Axis axis, string name);        public static Function OneHotOp(Variable operand, uint numClass, bool outputSparse, Axis axis, string name);
       public static Function OnesLike(Variable operand);        public static Function OnesLike(Variable operand);
       public static Function OnesLike(Variable operand, string name);        public static Function OnesLike(Variable operand, string name);
       public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers);        public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers);
       public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional);        public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional);
       public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional, string recurrentOp);        public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional, string recurrentOp);
       public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional, string recurrentOp, string name);        public static Function OptimizedRNNStack(Variable operand, Variable weights, uint hiddenSize, uint numLayers, bool bidirectional, string recurrentOp, string name);
       public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot);        public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot);
       public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot, double constantValue);        public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot, double constantValue);
       public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot, double constantValue, string name);        public static Function Pad(Variable operand, PaddingMode mode, SizeTVector head, SizeTVector foot, double constantValue, string name);
       public static Function PastValue(Variable operand);        public static Function PastValue(Variable operand);
       public static Function PastValue(Variable operand, uint offset);        public static Function PastValue(Variable operand, uint offset);
       public static Function PastValue(Variable operand, uint offset, string name);        public static Function PastValue(Variable operand, uint offset, string name);
       public static Function PastValue(Variable operand, Variable initialState);        public static Function PastValue(Variable operand, Variable initialState);
       public static Function PastValue(Variable operand, Variable initialState, uint offset);        public static Function PastValue(Variable operand, Variable initialState, uint offset);
       public static Function PastValue(Variable operand, Variable initialState, uint offset, string name);        public static Function PastValue(Variable operand, Variable initialState, uint offset, string name);
       public static Function PerDimMeanVarianceNormalize(Variable operand, NDArrayView mean, NDArrayView invStdDev);        public static Function PerDimMeanVarianceNormalize(Variable operand, NDArrayView mean, NDArrayView invStdDev);
       public static Function PerDimMeanVarianceNormalize(Variable operand, NDArrayView mean, NDArrayView invStdDev, string name);        public static Function PerDimMeanVarianceNormalize(Variable operand, NDArrayView mean, NDArrayView invStdDev, string name);
       public static Function PerDimMeanVarianceNormalize(Variable operand, Variable mean, Variable invStdDev);        public static Function PerDimMeanVarianceNormalize(Variable operand, Variable mean, Variable invStdDev);
       public static Function PerDimMeanVarianceNormalize(Variable operand, Variable mean, Variable invStdDev, string name);        public static Function PerDimMeanVarianceNormalize(Variable operand, Variable mean, Variable invStdDev, string name);
       public static Function Plus(Variable leftOperand, Variable rightOperand);        public static Function Plus(Variable leftOperand, Variable rightOperand);
       public static Function Plus(Variable leftOperand, Variable rightOperand, string name);        public static Function Plus(Variable leftOperand, Variable rightOperand, string name);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim, bool includePad);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim, bool includePad);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim, bool includePad, string name);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, BoolVector autoPadding, bool ceilOutDim, bool includePad, string name);
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, IEnumerable<bool> autoPadding);        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, IEnumerable<bool> autoPadding);
.        public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, SizeTVector lowerPad, SizeTVector upperPad);  
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, SizeTVector lowerPad, SizeTVector upperPad, bool ceilOutDim);  
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, SizeTVector lowerPad, SizeTVector upperPad, bool ceilOutDim, bool includePad);  
       public static Function Pooling(Variable operand, PoolingType poolingType, NDShape poolingWindowShape, NDShape strides, SizeTVector lowerPad, SizeTVector upperPad, bool ceilOutDim, bool includePad, string name);  
       public static Function Pow(Variable leftOperand, Variable rightOperand);        public static Function Pow(Variable leftOperand, Variable rightOperand);
       public static Function Pow(Variable leftOperand, Variable rightOperand, string name);        public static Function Pow(Variable leftOperand, Variable rightOperand, string name);
       public static Function PReLU(Variable alpha, Variable operand);        public static Function PReLU(Variable alpha, Variable operand);
       public static Function PReLU(Variable alpha, Variable operand, string name);        public static Function PReLU(Variable alpha, Variable operand, string name);
       public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates);        public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates);
       public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates, uint seed);        public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates, uint seed);
       public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates, uint seed, string name);        public static Function RandomSample(Variable operand, uint numSamples, bool allowDuplicates, uint seed, string name);
       public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates);        public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates);
       public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates, uint seed);        public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates, uint seed);
       public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates, uint seed, string name);        public static Function RandomSampleInclusionFrequency(Variable operand, uint numSamples, bool allowDuplicates, uint seed, string name);
       public static Function Reciprocal(Variable operand);        public static Function Reciprocal(Variable operand);
       public static Function Reciprocal(Variable operand, string name);        public static Function Reciprocal(Variable operand, string name);
       public static Function ReconcileDynamicAxes(Variable operand, Variable axesAsOperand);        public static Function ReconcileDynamicAxes(Variable operand, Variable axesAsOperand);
       public static Function ReconcileDynamicAxes(Variable operand, Variable axesAsOperand, string name);        public static Function ReconcileDynamicAxes(Variable operand, Variable axesAsOperand, string name);
       public static Function ReduceL1(Variable operand, AxisVector axes);        public static Function ReduceL1(Variable operand, AxisVector axes);
       public static Function ReduceL1(Variable operand, AxisVector axes, bool keepDims);        public static Function ReduceL1(Variable operand, AxisVector axes, bool keepDims);
       public static Function ReduceL1(Variable operand, AxisVector axes, bool keepDims, string name);        public static Function ReduceL1(Variable operand, AxisVector axes, bool keepDims, string name);
       public static Function ReduceL2(Variable operand, AxisVector axes);        public static Function ReduceL2(Variable operand, AxisVector axes);
       public static Function ReduceL2(Variable operand, AxisVector axes, bool keepDims);        public static Function ReduceL2(Variable operand, AxisVector axes, bool keepDims);
       public static Function ReduceL2(Variable operand, AxisVector axes, bool keepDims, string name);        public static Function ReduceL2(Variable operand, AxisVector axes, bool keepDims, string name);
       public static Function ReduceLogSum(Variable operand, Axis axis);        public static Function ReduceLogSum(Variable operand, Axis axis);
       public static Function ReduceLogSum(Variable operand, Axis axis, string name);        public static Function ReduceLogSum(Variable operand, Axis axis, string name);
.        public static Function ReduceLogSum(Variable operand, AxisVector axes);        public static Function ReduceLogSum(Variable operand, AxisVector axis);
       public static Function ReduceLogSum(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceLogSum(Variable operand, AxisVector axis, string name);
       public static Function ReduceLogSum(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceMax(Variable operand, Axis axis);        public static Function ReduceMax(Variable operand, Axis axis);
       public static Function ReduceMax(Variable operand, Axis axis, string name);        public static Function ReduceMax(Variable operand, Axis axis, string name);
.        public static Function ReduceMax(Variable operand, AxisVector axes);        public static Function ReduceMax(Variable operand, AxisVector axis);
       public static Function ReduceMax(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceMax(Variable operand, AxisVector axis, string name);
       public static Function ReduceMax(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceMean(Variable operand, Axis axis);        public static Function ReduceMean(Variable operand, Axis axis);
       public static Function ReduceMean(Variable operand, Axis axis, string name);        public static Function ReduceMean(Variable operand, Axis axis, string name);
.        public static Function ReduceMean(Variable operand, AxisVector axes);        public static Function ReduceMean(Variable operand, AxisVector axis);
       public static Function ReduceMean(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceMean(Variable operand, AxisVector axis, string name);
       public static Function ReduceMean(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceMin(Variable operand, Axis axis);        public static Function ReduceMin(Variable operand, Axis axis);
       public static Function ReduceMin(Variable operand, Axis axis, string name);        public static Function ReduceMin(Variable operand, Axis axis, string name);
.        public static Function ReduceMin(Variable operand, AxisVector axes);        public static Function ReduceMin(Variable operand, AxisVector axis);
       public static Function ReduceMin(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceMin(Variable operand, AxisVector axis, string name);
       public static Function ReduceMin(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceProd(Variable operand, Axis axis);        public static Function ReduceProd(Variable operand, Axis axis);
       public static Function ReduceProd(Variable operand, Axis axis, string name);        public static Function ReduceProd(Variable operand, Axis axis, string name);
.        public static Function ReduceProd(Variable operand, AxisVector axes);        public static Function ReduceProd(Variable operand, AxisVector axis);
       public static Function ReduceProd(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceProd(Variable operand, AxisVector axis, string name);
       public static Function ReduceProd(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceSum(Variable operand, Axis axis);        public static Function ReduceSum(Variable operand, Axis axis);
       public static Function ReduceSum(Variable operand, Axis axis, string name);        public static Function ReduceSum(Variable operand, Axis axis, string name);
.        public static Function ReduceSum(Variable operand, AxisVector axes);        public static Function ReduceSum(Variable operand, AxisVector axis);
       public static Function ReduceSum(Variable operand, AxisVector axes, bool keepDims);         public static Function ReduceSum(Variable operand, AxisVector axis, string name);
       public static Function ReduceSum(Variable operand, AxisVector axes, bool keepDims, string name);  
       public static Function ReduceSumSquare(Variable operand, AxisVector axes);        public static Function ReduceSumSquare(Variable operand, AxisVector axes);
       public static Function ReduceSumSquare(Variable operand, AxisVector axes, bool keepDims);        public static Function ReduceSumSquare(Variable operand, AxisVector axes, bool keepDims);
       public static Function ReduceSumSquare(Variable operand, AxisVector axes, bool keepDims, string name);        public static Function ReduceSumSquare(Variable operand, AxisVector axes, bool keepDims, string name);
       public static Function ReLU(Variable operand);        public static Function ReLU(Variable operand);
       public static Function ReLU(Variable operand, string name);        public static Function ReLU(Variable operand, string name);
       public static Function Reshape(Variable operand, NDShape newShape);        public static Function Reshape(Variable operand, NDShape newShape);
       public static Function Reshape(Variable operand, NDShape newShape, string name);        public static Function Reshape(Variable operand, NDShape newShape, string name);
       public static Function Reshape(Variable operand, NDShape replacementShape, Axis beginAxis, Axis endAxis);        public static Function Reshape(Variable operand, NDShape replacementShape, Axis beginAxis, Axis endAxis);
       public static Function Reshape(Variable operand, NDShape replacementShape, Axis beginAxis, Axis endAxis, string name);        public static Function Reshape(Variable operand, NDShape replacementShape, Axis beginAxis, Axis endAxis, string name);
       public static Function ROIPooling(Variable operand, Variable rois, PoolingType poolingType, NDShape roiOutputShape, double spatialScale, string name);        public static Function ROIPooling(Variable operand, Variable rois, PoolingType poolingType, NDShape roiOutputShape, double spatialScale, string name);
       public static Function Round(Variable operand);        public static Function Round(Variable operand);
       public static Function Round(Variable operand, string name);        public static Function Round(Variable operand, string name);
       public static Function SELU(Variable operand);        public static Function SELU(Variable operand);
       public static Function SELU(Variable operand, double gamma);        public static Function SELU(Variable operand, double gamma);
       public static Function SELU(Variable operand, double gamma, double alpha);        public static Function SELU(Variable operand, double gamma, double alpha);
       public static Function SELU(Variable operand, double gamma, double alpha, string name);        public static Function SELU(Variable operand, double gamma, double alpha, string name);
       public static Function SequenceBroadcastAs(Variable operand, Variable broadcastAs);        public static Function SequenceBroadcastAs(Variable operand, Variable broadcastAs);
       public static Function SequenceBroadcastAs(Variable operand, Variable broadcastAs, string name);        public static Function SequenceBroadcastAs(Variable operand, Variable broadcastAs, string name);
       public static Function SequenceFirst(Variable operand);        public static Function SequenceFirst(Variable operand);
       public static Function SequenceFirst(Variable operand, string name);        public static Function SequenceFirst(Variable operand, string name);
       public static Function SequenceGather(Variable operand, Variable condition);        public static Function SequenceGather(Variable operand, Variable condition);
       public static Function SequenceGather(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor);        public static Function SequenceGather(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor);
       public static Function SequenceGather(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor, string name);        public static Function SequenceGather(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor, string name);
       public static Function SequenceGather(Variable operand, Variable condition, string name);        public static Function SequenceGather(Variable operand, Variable condition, string name);
       public static Function SequenceIsFirst(Variable operand);        public static Function SequenceIsFirst(Variable operand);
       public static Function SequenceIsFirst(Variable operand, string name);        public static Function SequenceIsFirst(Variable operand, string name);
       public static Function SequenceIsLast(Variable operand);        public static Function SequenceIsLast(Variable operand);
       public static Function SequenceIsLast(Variable operand, string name);        public static Function SequenceIsLast(Variable operand, string name);
       public static Function SequenceLast(Variable operand);        public static Function SequenceLast(Variable operand);
       public static Function SequenceLast(Variable operand, string name);        public static Function SequenceLast(Variable operand, string name);
       public static Function SequenceReduceMax(Variable operand);        public static Function SequenceReduceMax(Variable operand);
       public static Function SequenceReduceMax(Variable operand, string name);        public static Function SequenceReduceMax(Variable operand, string name);
       public static Function SequenceReduceSum(Variable operand);        public static Function SequenceReduceSum(Variable operand);
       public static Function SequenceReduceSum(Variable operand, string name);        public static Function SequenceReduceSum(Variable operand, string name);
       public static Function SequenceScatter(Variable operand, Variable condition);        public static Function SequenceScatter(Variable operand, Variable condition);
       public static Function SequenceScatter(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor);        public static Function SequenceScatter(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor);
       public static Function SequenceScatter(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor, string name);        public static Function SequenceScatter(Variable operand, Variable condition, PairSizeTInt newDerivedSequenceAxisScalingAndAdditiveFactor, string name);
       public static Function SequenceScatter(Variable operand, Variable condition, string name);        public static Function SequenceScatter(Variable operand, Variable condition, string name);
       public static Function SequenceSlice(Variable operand, int beginIndex, int endIndex);        public static Function SequenceSlice(Variable operand, int beginIndex, int endIndex);
       public static Function SequenceSlice(Variable operand, int beginIndex, int endIndex, string name);        public static Function SequenceSlice(Variable operand, int beginIndex, int endIndex, string name);
       public static Function SequenceSoftmax(Variable operand);        public static Function SequenceSoftmax(Variable operand);
       public static Function SequenceSoftmax(Variable operand, string name);        public static Function SequenceSoftmax(Variable operand, string name);
       public static Function SequenceUnpack(Variable operand, double paddingValue, bool supressMaskOutput);        public static Function SequenceUnpack(Variable operand, double paddingValue, bool supressMaskOutput);
       public static Function SequenceUnpack(Variable operand, double paddingValue, bool supressMaskOutput, string name);        public static Function SequenceUnpack(Variable operand, double paddingValue, bool supressMaskOutput, string name);
       public static Function SequenceWhere(Variable condition);        public static Function SequenceWhere(Variable condition);
       public static Function SequenceWhere(Variable condition, string name);        public static Function SequenceWhere(Variable condition, string name);
       public static Function Sigmoid(Variable operand);        public static Function Sigmoid(Variable operand);
       public static Function Sigmoid(Variable operand, string name);        public static Function Sigmoid(Variable operand, string name);
       public static Function Sin(Variable operand);        public static Function Sin(Variable operand);
       public static Function Sin(Variable operand, string name);        public static Function Sin(Variable operand, string name);
       public static Function Sinh(Variable operand);        public static Function Sinh(Variable operand);
       public static Function Sinh(Variable operand, string name);        public static Function Sinh(Variable operand, string name);
       public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex);        public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex);
       public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, IntVector strides);        public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, IntVector strides);
       public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, IntVector strides, string name);        public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, IntVector strides, string name);
       public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, string name);        public static Function Slice(Variable operand, AxisVector axis, IntVector beginIndex, IntVector endIndex, string name);
       public static Function Softmax(Variable operand);        public static Function Softmax(Variable operand);
       public static Function Softmax(Variable operand, Axis axis);        public static Function Softmax(Variable operand, Axis axis);
       public static Function Softmax(Variable operand, Axis axis, string name);        public static Function Softmax(Variable operand, Axis axis, string name);
       public static Function Softmax(Variable operand, string name);        public static Function Softmax(Variable operand, string name);
       public static Function Softplus(Variable operand);        public static Function Softplus(Variable operand);
       public static Function Softplus(Variable operand, string name);        public static Function Softplus(Variable operand, string name);
       public static Function Softsign(Variable operand);        public static Function Softsign(Variable operand);
       public static Function Softsign(Variable operand, string name);        public static Function Softsign(Variable operand, string name);
       public static Function SpaceToDepth(Variable operand, uint blockSize);        public static Function SpaceToDepth(Variable operand, uint blockSize);
       public static Function SpaceToDepth(Variable operand, uint blockSize, string name);        public static Function SpaceToDepth(Variable operand, uint blockSize, string name);
       public static Function SpatialConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples);        public static Function SpatialConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples);
       public static Function SpatialConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples, string name);        public static Function SpatialConvolution(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples, string name);
.        public static Function SpatialConvolutionSequenceShape(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples);  
       public static Function SpatialConvolutionSequenceShape(Variable convolutionMap, Variable operand, NDShape strides, BoolVector sharing, BoolVector autoPadding, NDShape dilation, uint maxTempMemSizeInSamples, string name);  
       public static Function Splice(VariableVector operands, Axis axis);        public static Function Splice(VariableVector operands, Axis axis);
       public static Function Splice(VariableVector operands, Axis axis, string name);        public static Function Splice(VariableVector operands, Axis axis, string name);
       public static Function Sqrt(Variable operand);        public static Function Sqrt(Variable operand);
       public static Function Sqrt(Variable operand, string name);        public static Function Sqrt(Variable operand, string name);
       public static Function Square(Variable operand);        public static Function Square(Variable operand);
       public static Function Square(Variable operand, string name);        public static Function Square(Variable operand, string name);
       public static Function SquaredError(Variable prediction, Variable targets);        public static Function SquaredError(Variable prediction, Variable targets);
       public static Function SquaredError(Variable prediction, Variable targets, string name);        public static Function SquaredError(Variable prediction, Variable targets, string name);
       public static Function Squeeze(Variable operand);        public static Function Squeeze(Variable operand);
       public static Function Squeeze(Variable operand, AxisVector axis);        public static Function Squeeze(Variable operand, AxisVector axis);
       public static Function Squeeze(Variable operand, AxisVector axis, string name);        public static Function Squeeze(Variable operand, AxisVector axis, string name);
       public static Function Squeeze(Variable operand, string name);        public static Function Squeeze(Variable operand, string name);
       public static Function StopGradient(Variable operand);        public static Function StopGradient(Variable operand);
       public static Function StopGradient(Variable operand, string name);        public static Function StopGradient(Variable operand, string name);
.        public static Function StraightThrough(Variable operand);  
       public static Function StraightThrough(Variable operand, string name);  
       public static Function Sum(VariableVector operands);        public static Function Sum(VariableVector operands);
       public static Function Sum(VariableVector operands, string name);        public static Function Sum(VariableVector operands, string name);
.        public static Function Tan(Variable operand);  
       public static Function Tan(Variable operand, string name);  
       public static Function Tanh(Variable operand);        public static Function Tanh(Variable operand);
       public static Function Tanh(Variable operand, string name);        public static Function Tanh(Variable operand, string name);
       public static Function Times(Variable leftOperand, Variable rightOperand);        public static Function Times(Variable leftOperand, Variable rightOperand);
       public static Function Times(Variable leftOperand, Variable rightOperand, string name);        public static Function Times(Variable leftOperand, Variable rightOperand, string name);
       public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank);        public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank);
       public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, int inferInputRankToMap);        public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, int inferInputRankToMap);
       public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, int inferInputRankToMap, string name);        public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, int inferInputRankToMap, string name);
       public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, string name);        public static Function Times(Variable leftOperand, Variable rightOperand, uint outputRank, string name);
       public static Function ToBatch(Variable operand);        public static Function ToBatch(Variable operand);
       public static Function ToBatch(Variable operand, string name);        public static Function ToBatch(Variable operand, string name);
       public static Function TopK(Variable operand, uint k);        public static Function TopK(Variable operand, uint k);
       public static Function TopK(Variable operand, uint k, Axis axis);        public static Function TopK(Variable operand, uint k, Axis axis);
       public static Function TopK(Variable operand, uint k, Axis axis, string name);        public static Function TopK(Variable operand, uint k, Axis axis, string name);
       public static Function TopK(Variable operand, uint k, string name);        public static Function TopK(Variable operand, uint k, string name);
       public static Function ToSequence(Variable operand, string sequenceAxisNamePrefix);        public static Function ToSequence(Variable operand, string sequenceAxisNamePrefix);
       public static Function ToSequence(Variable operand, string sequenceAxisNamePrefix, string name);        public static Function ToSequence(Variable operand, string sequenceAxisNamePrefix, string name);
       public static Function ToSequence(Variable operand, Variable sequenceLengths, string sequenceAxisNamePrefix);        public static Function ToSequence(Variable operand, Variable sequenceLengths, string sequenceAxisNamePrefix);
       public static Function ToSequence(Variable operand, Variable sequenceLengths, string sequenceAxisNamePrefix, string name);        public static Function ToSequence(Variable operand, Variable sequenceLengths, string sequenceAxisNamePrefix, string name);
       public static Function ToSequenceLike(Variable operand, Variable dynamicAxesLike);        public static Function ToSequenceLike(Variable operand, Variable dynamicAxesLike);
       public static Function ToSequenceLike(Variable operand, Variable dynamicAxesLike, string name);        public static Function ToSequenceLike(Variable operand, Variable dynamicAxesLike, string name);
       public static Function Transpose(Variable operand);        public static Function Transpose(Variable operand);
       public static Function Transpose(Variable operand, AxisVector permutation);        public static Function Transpose(Variable operand, AxisVector permutation);
       public static Function Transpose(Variable operand, AxisVector permutation, string name);        public static Function Transpose(Variable operand, AxisVector permutation, string name);
       public static Function Transpose(Variable operand, string name);        public static Function Transpose(Variable operand, string name);
       public static Function TransposeAxes(Variable operand, Axis axis1, Axis axis2);        public static Function TransposeAxes(Variable operand, Axis axis1, Axis axis2);
       public static Function TransposeAxes(Variable operand, Axis axis1, Axis axis2, string name);        public static Function TransposeAxes(Variable operand, Axis axis1, Axis axis2, string name);
       public static Function TransposeTimes(Variable leftOperand, Variable rightOperand);        public static Function TransposeTimes(Variable leftOperand, Variable rightOperand);
       public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, string name);        public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, string name);
       public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, uint outputRank);        public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, uint outputRank);
       public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, uint outputRank, string name);        public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, uint outputRank, string name);
       public static Function UniformRandom(NDShape shape, DataType dataType);        public static Function UniformRandom(NDShape shape, DataType dataType);
       public static Function UniformRandom(NDShape shape, DataType dataType, double low);        public static Function UniformRandom(NDShape shape, DataType dataType, double low);
       public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high);        public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high);
       public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high, uint seed);        public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high, uint seed);
       public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high, uint seed, string name);        public static Function UniformRandom(NDShape shape, DataType dataType, double low, double high, uint seed, string name);
       public static Function UniformRandomLike(Variable operand);        public static Function UniformRandomLike(Variable operand);
       public static Function UniformRandomLike(Variable operand, double low);        public static Function UniformRandomLike(Variable operand, double low);
       public static Function UniformRandomLike(Variable operand, double low, double high);        public static Function UniformRandomLike(Variable operand, double low, double high);
       public static Function UniformRandomLike(Variable operand, double low, double high, uint seed);        public static Function UniformRandomLike(Variable operand, double low, double high, uint seed);
       public static Function UniformRandomLike(Variable operand, double low, double high, uint seed, string name);        public static Function UniformRandomLike(Variable operand, double low, double high, uint seed, string name);
       public static Function UnpackBatch(Variable operand, string name);        public static Function UnpackBatch(Variable operand, string name);
       public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape);        public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape);
       public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides);        public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides);
       public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides, BoolVector autoPadding);        public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides, BoolVector autoPadding);
       public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides, BoolVector autoPadding, string name);        public static Function Unpooling(Variable operand, Variable poolingInput, PoolingType UnpoolingType, NDShape UnpoolingWindowShape, NDShape strides, BoolVector autoPadding, string name);
.        public static Function Unsqueeze(Variable operand, AxisVector axes);  
       public static Function Unsqueeze(Variable operand, AxisVector axes, string name);  
       public static Function WeightedBinaryCrossEntropy(Variable prediction, Variable targets, Variable weights);        public static Function WeightedBinaryCrossEntropy(Variable prediction, Variable targets, Variable weights);
       public static Function WeightedBinaryCrossEntropy(Variable prediction, Variable targets, Variable weights, string name);        public static Function WeightedBinaryCrossEntropy(Variable prediction, Variable targets, Variable weights, string name);
       public static Function ZerosLike(Variable operand);        public static Function ZerosLike(Variable operand);
       public static Function ZerosLike(Variable operand, string name);        public static Function ZerosLike(Variable operand, string name);
       public static int DefaultParamInitScale { get; }        public static int DefaultParamInitScale { get; }
       public static int SentinelValueForInferParamInitRank { get; }        public static int SentinelValueForInferParamInitRank { get; }
       public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);        public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);
       public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho);        public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho);
       public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho, double epsilon);        public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho, double epsilon);
       public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho, double epsilon, AdditionalLearningOptions additionalOptions);        public static Learner AdaDeltaLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double rho, double epsilon, AdditionalLearningOptions additionalOptions);
       public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);        public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);
       public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, bool needAveMultiplier);        public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, bool needAveMultiplier);
       public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, bool needAveMultiplier, AdditionalLearningOptions additionalOptions);        public static Learner AdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, bool needAveMultiplier, AdditionalLearningOptions additionalOptions);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon, bool adamax);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon, bool adamax);
       public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon, bool adamax, AdditionalLearningOptions additionalOptions);        public static Learner AdamLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, double epsilon, bool adamax, AdditionalLearningOptions additionalOptions);
       public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);        public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);
       public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);        public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);
       public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule);        public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule);
       public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, AdditionalLearningOptions additionalOptions);        public static Learner FSAdaGradLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, TrainingParameterScheduleDouble varianceMomentumSchedule, AdditionalLearningOptions additionalOptions);
       public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);        public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule);
       public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);        public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain);
       public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, AdditionalLearningOptions additionalOptions);        public static Learner MomentumSGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, TrainingParameterScheduleDouble momentumSchedule, bool unitGain, AdditionalLearningOptions additionalOptions);
       public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min);        public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min);
       public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min, bool needAveMultiplier);        public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min, bool needAveMultiplier);
       public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min, bool needAveMultiplier, AdditionalLearningOptions additionalOptions);        public static Learner RMSPropLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, double gamma, double inc, double dec, double max, double min, bool needAveMultiplier, AdditionalLearningOptions additionalOptions);
       public static Learner SGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);        public static Learner SGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule);
       public static Learner SGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, AdditionalLearningOptions additionalOptions);        public static Learner SGDLearner(ParameterVector parameters, TrainingParameterScheduleDouble learningRateSchedule, AdditionalLearningOptions additionalOptions);
       public static MinibatchSource CreateCompositeMinibatchSource(MinibatchSourceConfig configuration);        public static MinibatchSource CreateCompositeMinibatchSource(MinibatchSourceConfig configuration);
       public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs);        public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs);
       public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize);        public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize);
       public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize);        public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize);
       public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize, uint randomizationWindow);        public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize, uint randomizationWindow);
       public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize, uint randomizationWindow, bool sampleBasedRandomizationWindow);        public static MinibatchSource TextFormatMinibatchSource(string dataFilePath, StreamConfigurationVector streamConfigs, uint epochSize, bool randomize, uint randomizationWindow, bool sampleBasedRandomizationWindow);
       public static string DataTypeName(DataType dataType);        public static string DataTypeName(DataType dataType);
       public static string DeviceKindName(DeviceKind deviceKind);        public static string DeviceKindName(DeviceKind deviceKind);
       public static string VariableKindName(VariableKind variableKind);        public static string VariableKindName(VariableKind variableKind);
       public static TraceLevel GetTraceLevel();        public static TraceLevel GetTraceLevel();
       public static Trainer CreateTrainer(Function model, Function lossFunction, Function evaluationFunction, LearnerVector parameterLearners);        public static Trainer CreateTrainer(Function model, Function lossFunction, Function evaluationFunction, LearnerVector parameterLearners);
       public static Trainer CreateTrainer(Function model, Function lossFunction, Function evaluationFunction, LearnerVector parameterLearners, ProgressWriterVector progressWriters);        public static Trainer CreateTrainer(Function model, Function lossFunction, Function evaluationFunction, LearnerVector parameterLearners, ProgressWriterVector progressWriters);
       public static Trainer CreateTrainer(Function model, Function lossFunction, LearnerVector parameterLearners);        public static Trainer CreateTrainer(Function model, Function lossFunction, LearnerVector parameterLearners);
       public static Trainer CreateTrainer(Function model, Function lossFunction, LearnerVector parameterLearners, ProgressWriterVector progressWriters);        public static Trainer CreateTrainer(Function model, Function lossFunction, LearnerVector parameterLearners, ProgressWriterVector progressWriters);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(double time_constant);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(double time_constant);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(DoubleVector schedule);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(DoubleVector schedule);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(DoubleVector schedule, uint epoch_size);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(DoubleVector schedule, uint epoch_size);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(TrainingParameterScheduleDouble schedule);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(TrainingParameterScheduleDouble schedule);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(VectorPairSizeTDouble schedule);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(VectorPairSizeTDouble schedule);
       public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(VectorPairSizeTDouble schedule, uint epoch_size);        public static TrainingParameterScheduleDouble MomentumAsTimeConstantSchedule(VectorPairSizeTDouble schedule, uint epoch_size);
       public static uint DataTypeSize(DataType dataType);        public static uint DataTypeSize(DataType dataType);
       public static uint GenerateRandomSeed();        public static uint GenerateRandomSeed();
       public static uint GenerateRandomSeed(bool perWorkerLocalValue);        public static uint GenerateRandomSeed(bool perWorkerLocalValue);
       public static uint GetMaxNumCPUThreads();        public static uint GetMaxNumCPUThreads();
       public static uint GetRandomSeed();        public static uint GetRandomSeed();
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType);
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, AxisVector dynamicAxes);
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, bool needsGradient, string name);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, bool needsGradient, string name);
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, bool needsGradient, string name, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, bool needsGradient, string name, AxisVector dynamicAxes);
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, string name);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, string name);
       public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, string name, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, bool isSparse, DataType dataType, string name, AxisVector dynamicAxes);
       public static Variable InputVariable(NDShape shape, DataType dataType);        public static Variable InputVariable(NDShape shape, DataType dataType);
       public static Variable InputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes);
       public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient);        public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient);
       public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient, string name);        public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient, string name);
       public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient, string name, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, DataType dataType, bool needsGradient, string name, AxisVector dynamicAxes);
       public static Variable InputVariable(NDShape shape, DataType dataType, string name);        public static Variable InputVariable(NDShape shape, DataType dataType, string name);
       public static Variable InputVariable(NDShape shape, DataType dataType, string name, AxisVector dynamicAxes);        public static Variable InputVariable(NDShape shape, DataType dataType, string name, AxisVector dynamicAxes);
       public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes);        public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes);
       public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, bool needsGradient);        public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, bool needsGradient);
       public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, bool needsGradient, string name);        public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, bool needsGradient, string name);
       public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, string name);        public static Variable OutputVariable(NDShape shape, DataType dataType, AxisVector dynamicAxes, string name);
       public static Variable PlaceholderVariable();        public static Variable PlaceholderVariable();
       public static Variable PlaceholderVariable(NDShape shape);        public static Variable PlaceholderVariable(NDShape shape);
       public static Variable PlaceholderVariable(NDShape shape, AxisVector dynamicAxes);        public static Variable PlaceholderVariable(NDShape shape, AxisVector dynamicAxes);
       public static Variable PlaceholderVariable(NDShape shape, DataType dataType, string name);        public static Variable PlaceholderVariable(NDShape shape, DataType dataType, string name);
       public static Variable PlaceholderVariable(NDShape shape, DataType dataType, string name, AxisVector dynamicAxes);        public static Variable PlaceholderVariable(NDShape shape, DataType dataType, string name, AxisVector dynamicAxes);
       public static Variable PlaceholderVariable(NDShape shape, string name, AxisVector dynamicAxes);        public static Variable PlaceholderVariable(NDShape shape, string name, AxisVector dynamicAxes);
       public static Variable PlaceholderVariable(string name);        public static Variable PlaceholderVariable(string name);
       public static void ComputeInputPerDimMeansAndInvStdDevs(MinibatchSource minibatchSource, UnorderedMapStreamInformationPairNDArrayViewPtrNDArrayViewPtr computedMeanAndVariances);        public static void ComputeInputPerDimMeansAndInvStdDevs(MinibatchSource minibatchSource, UnorderedMapStreamInformationPairNDArrayViewPtrNDArrayViewPtr computedMeanAndVariances);
       public static void ComputeInputPerDimMeansAndInvStdDevs(MinibatchSource minibatchSource, UnorderedMapStreamInformationPairNDArrayViewPtrNDArrayViewPtr computedMeanAndVariances, DeviceDescriptor device);        public static void ComputeInputPerDimMeansAndInvStdDevs(MinibatchSource minibatchSource, UnorderedMapStreamInformationPairNDArrayViewPtrNDArrayViewPtr computedMeanAndVariances, DeviceDescriptor device);
       public static void DisableCPUEvalOptimization();        public static void DisableCPUEvalOptimization();
       public static void DisableNodeTimeing();        public static void DisableNodeTimeing();
       public static void EnableCPUEvalOptimization();        public static void EnableCPUEvalOptimization();
.        public static void ForceDeterministicAlgorithms();  
       public static void ResetRandomSeed();        public static void ResetRandomSeed();
       public static void ResetRandomSeed(uint value);        public static void ResetRandomSeed(uint value);
.        public static void SetFixedRandomSeed(uint value);  
       public static void SetMathLibTraceLevel(int traceLevel);        public static void SetMathLibTraceLevel(int traceLevel);
       public static void SetMaxNumCPUThreads(uint numCPUThreads);        public static void SetMaxNumCPUThreads(uint numCPUThreads);
       public static void SetTraceLevel(TraceLevel value);        public static void SetTraceLevel(TraceLevel value);
       public static void UseSparseGradientAggregationInDataParallelSGD(bool enable);        public static void UseSparseGradientAggregationInDataParallelSGD(bool enable);
   
   
   

 

Cognitive Toolkitのダウンロード、環境設定【C#編】

マイクロソフトのCognitive ToolkitをVisual StudioのC#で使用するためのインストール方法、環境構築を紹介します。

 

結論からすればCognitive Toolkitを動作させるためには、関連するDLLファイルがあればよいだけなのですが、この関連するファイルをNuGetより入手する方法でやりたいと思います。

 

まず、Visual Studioで何でもいいので、C#のプロジェクトを作成します。

ソリューションエクスプローラーよりプロジェクト名を右クリックし、NuGetパッケージの管理をクリックします。

 

表示されたウィンドウの参照を選択し、検索ボックスにCNTKと入力すると各種ライブラリが表示されるので、ここではCNTK.GPUを選択します。

 

 

画面右側に表示されているインストールをクリックします。

 

 

あとは画面の流れに沿ってインストールを行います。

 

OKボタンをクリック

 

同意するをクリック

 

すると、プロジェクトの参照に Cntk.Core.Managed-2.5.1 というのが追加されます。

 

これで、Cognitive Toolkitのインストールは完了です。

 

しかし、このままでプログラムをビルド、実行しようとすると、以下のようなエラーや警告が表示されます。

 

 

そもそもCognitive Toolkitは64bit専用のライブラリなので、プロジェクトも64bitに設定する必要があります。

 

64bitの設定にするには、Visual Studio のソリューションプラットフォームより、構成マネージャーを選択します。

 

次にアクティブソリューションプラットフォームより、<新規作成>を選択します。

 

新しいソリューションプラットフォームというウィンドウが表示されるので、下図のような状態(x64が表示されている状態)でOKボタンをクリックします。

 

構成マネージャーのウィンドウが下図のようになるので、閉じるボタンをクリックします。

 

この状態で、試しに処理で使用するデバイスを設定するコードをどこかに書いてみてビルドして、エラーが出なければ環境構築は完了です。

 

var device = CNTK.DeviceDescriptor.CPUDevice;

 

ちなみに、プログラムをビルドすると作成したプログラムの実行ファイルを同じフォルダに下図のように関連するDLLファイルがコピーされて配置されます。

 

 

Cognitive Toolkitでは、これらのDLLファイルがありさえすれば、動作してくれるので、例えば、プログラムはネットに接続されたPCで作成し、実際の実行用PCはネットに接続されていなくても、exeファイル、exe.configファイル、DLLファイルをコピーすれば動作してくれるので、環境構築が簡単にできるので、Cognitive Toolkitは自分の中ではポイントが高い!

(実際にはまっさらなPCに移植した事がないので、何か不足する可能性もありますが。。)

 

【C#】Bitmapの解像度(DPI)の取得設定

画像ファイルのプロパティをエクスプローラーで表示すると、下図のように水平方向の解像度、垂直方向の解像度が表示されますが、ほとんどの場合、Windowsでは96dpiと表示される場合が多いのですが、この解像度の値をC#で取得、設定(変更)してみたいと思います。

 

 

解像度を設定するにはBitmapクラスのSetResolutionメソッドを用いて、以下のように設定します。

var bmp = new Bitmap("Mandrill.bmp");
bmp.SetResolution(400, 400);

解像度を取得するにはGetResolutionではなくて、HorizontalResolutionプロパティVerticalResolutionプロパティが用意されています。

 

(コード例)

Console.WriteLine(String.Format("水平分解能 = {0}, 垂直分解能 = {1}", bmp.HorizontalResolution, bmp.VerticalResolution));

(実行結果)

 

試しに下記のようなコードで、Bitmap,Jpeg,Png,Tiffファイルで解像度の設定が有効になっているか?確認してみましたが、どれも設定されていました。

var bmp = new Bitmap("Mandrill.bmp");
bmp.Save("Mandrill400.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
bmp.Save("Mandrill400.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Save("Mandrill400.png", System.Drawing.Imaging.ImageFormat.Png);
bmp.Save("Mandrill400.tif", System.Drawing.Imaging.ImageFormat.Tiff);

ただし、Bitmapファイル(*.bmp)だけはファイルのプロパティで解像度が表示されなかったので、エクスプローラーで表示項目を増やして解像度を確認しました。

 

 

画像処理のためのC#テクニックへ戻る

【C#】正規分布に従う乱数の取得

.NETでは乱数のクラスにRamdomクラスがあります、どれも一様に分布する乱数しか取得できません。

 

例えば、NextDoubleメソッドを用いると、0以上、1.0未満の一様に分布した乱数を取得する事ができます。

var rnd = new Random(); 

for (int i = 0; i < 1000; i++) 
{ 
	Console.WriteLine(rnd.NextDouble().ToString()); 
}

上記プログラムで出力した値をExcelでヒストグラムにしてみると、0~1.0の一様??な乱数が取得させていることが分かります。

 

 

正規分布に従う乱数を取得するには、今回はボックス=ミュラー法という手法で乱数をしてみます。

XとYがお互いに独立で、0~1の範囲で一様に分布する乱数のとき

 

$${ Z }_{ 1 }=\sqrt { -2\log { X } } cos(2\pi Y)\\ { Z }_{ 2 }=\sqrt { -2\log { X } } sin(2\pi Y)$$

 

のZ1、Z2はそれぞれ標準偏差1.0、平均値0.0の正規分布に従う乱数となります。

(参考)ボックス=ミュラー法 Wikipedia

https://ja.m.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95

 

これをC#のプログラムにしてみると

var rnd = new Random(); 

double X, Y; 
double Z1, Z2; 

for (int i = 0; i < 1000; i++) 
{ 
	X = rnd.NextDouble(); 
	Y = rnd.NextDouble(); 
	
	Z1 = Math.Sqrt(-2.0 * Math.Log(X)) * Math.Cos(2.0 * Math.PI * Y); 
	Z2 = Math.Sqrt(-2.0 * Math.Log(X)) * Math.Sin(2.0 * Math.PI * Y); 

	Console.WriteLine(Z1.ToString()); 
	Console.WriteLine(Z2.ToString()); 
}

という感じ。

コンソールに吐き出された値をExcelでヒストグラムにしてみると

 

となり、確かに正規分布に従った感じの分布となりました。
標準偏差1.0、平均値0.0ではなく、標準偏差sigma、平均値ave のときの乱数が欲しい場合は

Z1 = sigma * Math.Sqrt(-2.0 * Math.Log(X)) * Math.Cos(2.0 * Math.PI * Y) + ave;
Z2 = sigma * Math.Sqrt(-2.0 * Math.Log(X)) * Math.Sin(2.0 * Math.PI * Y) + ave;

となります。

 

← C#へ戻る