| @@ -0,0 +1,33 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Framework | |||||
| { | |||||
| public static class common_shapes | |||||
| { | |||||
| /// <summary> | |||||
| /// Returns the broadcasted shape between `shape_x` and `shape_y | |||||
| /// </summary> | |||||
| /// <param name="shape_x"></param> | |||||
| /// <param name="shape_y"></param> | |||||
| public static Tensor broadcast_shape(Tensor shape_x, Tensor shape_y) | |||||
| { | |||||
| var return_dims = _broadcast_shape_helper(shape_x, shape_y); | |||||
| // return tensor_shape(return_dims); | |||||
| throw new NotFiniteNumberException(); | |||||
| } | |||||
| /// <summary> | |||||
| /// Helper functions for is_broadcast_compatible and broadcast_shape. | |||||
| /// </summary> | |||||
| /// <param name="shape_x"> A `TensorShape`</param> | |||||
| /// <param name="shape_y"> A `TensorShape`</param> | |||||
| /// <return> Returns None if the shapes are not broadcast compatible, | |||||
| /// a list of the broadcast dimensions otherwise. | |||||
| /// </return> | |||||
| public static Tensor _broadcast_shape_helper(Tensor shape_x, Tensor shape_y) | |||||
| { | |||||
| throw new NotFiniteNumberException(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,14 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| using Tensorflow; | |||||
| namespace Tensorflow.Operations.Distributions | |||||
| { | |||||
| public enum DistributionEnum | |||||
| { | |||||
| } | |||||
| } | |||||
| @@ -6,7 +6,7 @@ using System.Text; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| abstract class _BaseDistribution : Object | |||||
| abstract class _BaseDistribution : Python | |||||
| { | { | ||||
| // Abstract base class needed for resolving subclass hierarchy. | // Abstract base class needed for resolving subclass hierarchy. | ||||
| } | } | ||||
| @@ -22,8 +22,8 @@ namespace Tensorflow | |||||
| public ReparameterizationType _reparameterization_type {get;set;} | public ReparameterizationType _reparameterization_type {get;set;} | ||||
| public bool _validate_args {get;set;} | public bool _validate_args {get;set;} | ||||
| public bool _allow_nan_stats {get;set;} | public bool _allow_nan_stats {get;set;} | ||||
| public Dictionary<object, object> _parameters {get;set;} | |||||
| public List<object> _graph_parents {get;set;} | |||||
| public Dictionary<string, object> _parameters {get;set;} | |||||
| public List<Tensor> _graph_parents {get;set;} | |||||
| public string _name {get;set;} | public string _name {get;set;} | ||||
| /// <summary> | /// <summary> | ||||
| @@ -82,7 +82,21 @@ namespace Tensorflow | |||||
| /// </summary> | /// </summary> | ||||
| class ReparameterizationType | class ReparameterizationType | ||||
| { | { | ||||
| public string _rep_type { get; set; } | |||||
| public ReparameterizationType(string rep_type) | |||||
| { | |||||
| this._rep_type = rep_type; | |||||
| } | |||||
| public void repr() | |||||
| { | |||||
| Console.WriteLine($"<Reparameteriation Type: {this._rep_type}>" ); | |||||
| } | |||||
| public bool eq (ReparameterizationType other) | |||||
| { | |||||
| return this.Equals(other); | |||||
| } | |||||
| } | } | ||||
| @@ -1,10 +1,80 @@ | |||||
| using System.Collections.Generic; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| class Normal : Distribution | class Normal : Distribution | ||||
| { | { | ||||
| public Normal (Tensor loc, Tensor scale, bool validate_args=false, bool allow_nan_stats=true, string name="Normal") | |||||
| public Tensor _loc { get; set; } | |||||
| public Tensor _scale { get; set; } | |||||
| Dictionary<string, object> parameters = new Dictionary<string, object>(); | |||||
| /// <summary> | |||||
| /// The Normal distribution with location `loc` and `scale` parameters. | |||||
| /// Mathematical details | |||||
| /// The probability density function(pdf) is, | |||||
| /// ''' | |||||
| /// pdf(x; mu, sigma) = exp(-0.5 (x - mu)**2 / sigma**2) / Z | |||||
| /// Z = (2 pi sigma**2)**0.5 | |||||
| /// ''' | |||||
| /// where `loc = mu` is the mean, `scale = sigma` is the std.deviation, and, `Z` | |||||
| /// is the normalization constant. | |||||
| /// </summary> | |||||
| /// <param name="loc"></param> | |||||
| /// <param name="scale"></param> | |||||
| /// <param name="validate_args"></param> | |||||
| /// <param name="allow_nan_stats"></param> | |||||
| /// <param name="name"></param> | |||||
| public Normal (Tensor loc, Tensor scale, bool validate_args=false, bool allow_nan_stats=true, string name="Normal") | |||||
| { | |||||
| parameters.Add("name", name); | |||||
| parameters.Add("loc", loc); | |||||
| parameters.Add("scale", scale); | |||||
| parameters.Add("validate_args", validate_args); | |||||
| parameters.Add("allow_nan_stats", allow_nan_stats); | |||||
| with(new ops.name_scope(name, "", new { loc, scale }), scope => | |||||
| { | |||||
| with(ops.control_dependencies(validate_args ? new Operation[] { scale.op} : new Operation[] { }), cd => | |||||
| { | |||||
| this._loc = array_ops.identity(loc, name); | |||||
| this._scale = array_ops.identity(scale, name); | |||||
| base._dtype = this._scale.dtype; | |||||
| base._reparameterization_type = new ReparameterizationType("FULLY_REPARAMETERIZED"); | |||||
| base._validate_args = validate_args; | |||||
| base._allow_nan_stats = allow_nan_stats; | |||||
| base._parameters = parameters; | |||||
| base._graph_parents = new List<Tensor>(new Tensor[] { this._loc, this._scale }); | |||||
| base._name = name; | |||||
| }); | |||||
| }); | |||||
| } | |||||
| /// <summary> | |||||
| /// Distribution parameter for the mean. | |||||
| /// </summary> | |||||
| /// <returns></returns> | |||||
| public Tensor loc() | |||||
| { | |||||
| return this._loc; | |||||
| } | |||||
| /// <summary> | |||||
| /// Distribution parameter for standard deviation." | |||||
| /// </summary> | |||||
| /// <returns></returns> | |||||
| public Tensor scale() | |||||
| { | |||||
| return this._scale; | |||||
| } | |||||
| public Tensor _batch_shape_tensor() | |||||
| { | |||||
| return array_ops.broadcast_dynamic_shape(array_ops.shape(this._loc), array_ops.shape(this._scale)); | |||||
| } | |||||
| public Tensor _batch_shape() | |||||
| { | { | ||||
| return array_ops.broadcast_static_shape(new Tensor(this._loc.shape), new Tensor(this._scale.shape)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -239,5 +239,34 @@ namespace Tensorflow | |||||
| { | { | ||||
| return gen_array_ops.squeeze(input, axis, name); | return gen_array_ops.squeeze(input, axis, name); | ||||
| } | } | ||||
| public static Tensor identity(Tensor input, string name = null) | |||||
| { | |||||
| return gen_array_ops.identity(input, name); | |||||
| } | |||||
| /// <summary> | |||||
| /// Computes the shape of a broadcast given symbolic shapes. | |||||
| /// When shape_x and shape_y are Tensors representing shapes(i.e.the result of | |||||
| /// calling tf.shape on another Tensor) this computes a Tensor which is the shape | |||||
| /// of the result of a broadcasting op applied in tensors of shapes shape_x and | |||||
| /// shape_y. | |||||
| /// For example, if shape_x is [1, 2, 3] and shape_y is [5, 1, 3], the result is a | |||||
| /// Tensor whose value is [5, 2, 3]. | |||||
| /// This is useful when validating the result of a broadcasting operation when the | |||||
| /// tensors do not have statically known shapes. | |||||
| /// </summary> | |||||
| /// <param name="shape_x"> A rank 1 integer `Tensor`, representing the shape of x.</param> | |||||
| /// <param name="shape_y"> A rank 1 integer `Tensor`, representing the shape of y.</param> | |||||
| /// <returns> A rank 1 integer `Tensor` representing the broadcasted shape.</returns> | |||||
| public static Tensor broadcast_dynamic_shape(Tensor shape_x, Tensor shape_y) | |||||
| { | |||||
| return gen_array_ops.broadcast_args(shape_x, shape_y); | |||||
| } | |||||
| public static Tensor broadcast_static_shape(Tensor shape_x, Tensor shape_y) | |||||
| { | |||||
| return Framework.common_shapes.broadcast_shape(shape_x, shape_y); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -178,5 +178,21 @@ namespace Tensorflow | |||||
| return _op.outputs[0]; | return _op.outputs[0]; | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Return the shape of s0 op s1 with broadcast. | |||||
| /// Given `s0` and `s1`, tensors that represent shapes, compute `r0`, the | |||||
| /// broadcasted shape. `s0`, `s1` and `r0` are all integer vectors. | |||||
| /// </summary> | |||||
| /// <param name="s0"> A `Tensor`. Must be one of the following types: `int32`, `int64`.</param> | |||||
| /// <param name="s1"> A `Tensor`. Must have the same type as `s0`.</param> | |||||
| /// <param name="name"> A name for the operation (optional).</param> | |||||
| /// <returns> `Tensor`. Has the same type as `s0`.</returns> | |||||
| public static Tensor broadcast_args(Tensor s0, Tensor s1, string name = null) | |||||
| { | |||||
| var _op = _op_def_lib._apply_op_helper("BroadcastArgs", name, args: new { s0, s1, name }); | |||||
| return _op.outputs[0]; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||