/// <summary>
 /// Valida una rama y la agrega al circuito si corresponde
 /// En caso contrario solo agrega el componente indicado
 /// </summary>
 /// <param name="yaanalizados"></param>
 /// <param name="nodosnormales"></param>
 /// <param name="ramas"></param>
 /// <param name="nodo"></param>
 /// <param name="compo"></param>
 /// <param name="br"></param>
 protected static void ValidateBranch(List<Dipole> yaanalizados, List<Node> nodosnormales,
                                     List<Branch> ramas, Node nodo, Dipole compo, Branch br)
 {
     if (br.Components.Count <= 1)
     {
         if (compo is PasiveComponent)
         {
             Node other = compo.OtherNode(nodo);
             other.TypeOfNode = Node.NodeType.MultibranchCurrentNode;
             if (!nodosnormales.Contains(other))
                 nodosnormales.Add(other);
         }
         yaanalizados.Add(compo);
     }
     else
     {
         //rama valida
         ramas.Add(br);
         Node other = br.OtherNode(nodo);
         if (!nodosnormales.Contains(other))
             nodosnormales.Add(other);
         yaanalizados.AddRange(br.Components);
         foreach (var comp in br.Components)
         {
             comp.Owner = br;
         }
     }
 }
        protected static Branch FindBranch(Circuit cir, Node initialNode, Dipole Component)
        {
            Branch br = new Branch(cir);
            Dipole compo = Component;
            Node nodo = Component.OtherNode(initialNode);

            br.Nodes.Clear();
            //solo es valido si el circuito fue optimizado, y los paralelos
            //se reemplazaron por bloques paralelo
            while (nodo.Components.Count == 2 && cir.Reference != nodo)
            {
                br.Components.Add(compo);
                br.InternalNodes.Add(nodo);
                compo = nodo.OtherComponent(compo);
                nodo = compo.OtherNode(nodo);
            }
            br.Components.Add(compo);
            if (br.Components.Count > 1)
            {
                initialNode.Components.Remove(Component);
                initialNode.Components.Add(br);
                nodo.Components.Remove(compo);
                nodo.Components.Add(br);
                nodo.TypeOfNode = Node.NodeType.MultibranchCurrentNode;
            }
            br.Nodes.Add(initialNode);
            br.Nodes.Add(nodo);

            //hay que recorrer la rama para buscar los nodos intermedios flotantes 
            //y aquellos dependientes de los flotantes
            nodo = compo.OtherNode(nodo);
            while (nodo != initialNode)
            {
                if (nodo.TypeOfNode == Node.NodeType.VoltageFixedNode)
                {
                    // nothing, node was calculated
                }
                else if (compo is VoltageGenerator || compo is Capacitor)
                {
                    if (nodo.TypeOfNode == Node.NodeType.Unknow)
                        nodo.TypeOfNode = Node.NodeType.VoltageLinkedNode;
                    else
                        throw new NotImplementedException();
                }
                else if (compo is Resistor)
                {
                    if (nodo.TypeOfNode == Node.NodeType.Unknow)
                        nodo.TypeOfNode = Node.NodeType.VoltageDivideNode;
                    else
                        throw new NotImplementedException();
                }
                else if (compo is Inductor || compo is CurrentGenerator)
                { 
                    //nada, solo imponen la corriente
                }
                else
                {
                    if (nodo.TypeOfNode == Node.NodeType.Unknow)
                        nodo.TypeOfNode = Node.NodeType.InternalBranchNode;
                    else
                        throw new NotImplementedException();
                }

                compo = nodo.OtherComponent(compo);
                nodo = compo.OtherNode(nodo);
            }


            return br;
        }