/// <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); }
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); }
/// <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; }