コード例 #1
0
ファイル: CondContext.cs プロジェクト: mayuzx/TensorFlow.NET
        /// <summary>
        /// Add `val` to the current context and its outer context recursively.
        /// </summary>
        /// <param name="val"></param>
        public override Tensor AddValue(Tensor val)
        {
            Tensor result = null;

            if (_values.Contains(val.name))
            {
                // Use the real value if it comes from outer context. This is needed in
                // particular for nested conds.
                if (_external_values.ContainsKey(val.name))
                {
                    result = _external_values[val.name];
                }

                result = result == null ? val : result;
            }
            else
            {
                result = val;
                _values.Add(val.name);
                // TODO: _outer_context
                if (_outer_context != null)
                {
                    result = _outer_context.AddValue(val);
                    _values.Add(result.name);
                    _external_values[result.name] = result;
                }

                with(ops.control_dependencies(null), ctrl =>
                {
                    var(r0, r1) = control_flow_ops._SwitchRefOrTensor(result, _pred);
                    result      = new[] { r0, r1 }[_branch];
                    if (_outer_context != null)
                    {
                        _outer_context.AddInnerOp(result.op);
                    }
                });

                result.op.graph.prevent_fetching(result.op);
                result.op._set_control_flow_context(this);

                // Mark Switch output as seen by this context and any outer contexts,
                // just like what we do for normal op outputs in _AddOpInternal() below.
                IControlFlowContext ctxt = this;
                while (ctxt != null)
                {
                    ctxt.values.Add(result.name);
                    ctxt = ctxt.outer_context;
                }
                _external_values[val.name] = result;
            }
            return(result);
        }
コード例 #2
0
        public void __enter__()
        {
            if (_new_stack)
            {
                // Clear the control_dependencies graph.
                _old_stack = _graph._control_dependencies_stack;
                _graph._control_dependencies_stack = new List <_ControlDependenciesController>();

                // Clear the control_flow_context too.
                _old_control_flow_context = _graph._get_control_flow_context();
                _graph._set_control_flow_context(null);
            }

            _graph._push_control_dependencies_controller(this);
        }
コード例 #3
0
 /// <summary>
 /// Sets the current control flow context.
 /// </summary>
 /// <param name="ctx">a context object.</param>
 public void _set_control_flow_context(IControlFlowContext ctx)
 {
     _control_flow_context = ctx;
 }