static Dictionary <string, DetansPair> getDetans(PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount) { Dictionary <string, DetansPair> elementsToDetanPairDictionary = new Dictionary <string, DetansPair>(); int elementsCount = elements.Length; List <Element> elementsList = new List <Element>(); foreach (PassiveElement element in scheme.passiveElementsList) { elementsList.Add(element); } List <Element> activeElementsForZ = scheme.activeElementsListForZ; List <Element> activeElementsForQ = scheme.activeElementsListForQ; //elementsList.AddRange(scheme.nullersList); string selectedElementsString = Calculations.elementsToNamesString(elements); for (int i = 0; i <= elementsCount; i++) { int[] indexes = Calculations.makeCombination(i); while (true) { List <Element> removedElements = new List <Element>(); List <Element> subtendedElements = new List <Element>(); List <Element> localElementsList = new List <Element>(elementsList); List <Element> associatedElements = new List <Element>(); for (int j = 0; j < elementsCount; j++) { if (Array.IndexOf(indexes, j + 1) >= 0) { scheme.transformElementToInfin(elements[j], localElementsList); associatedElements.Add(elements[j]); removedElements.Add(elements[j]); } else { scheme.transformElementToZero(elements[j], localElementsList); subtendedElements.Add(elements[j]); } } List <Element> elementsListToZ = new List <Element>(localElementsList); elementsListToZ.AddRange(activeElementsForZ); List <Element> elementsListToQ = new List <Element>(localElementsList); elementsListToQ.AddRange(activeElementsForQ); string pattern = ""; string delimiter = ";"; string removedElementsString = Calculations.elementsToNamesString(removedElements, pattern, delimiter); string keyString = selectedElementsString + "|" + removedElementsString; string numeratorDetan; string denominatorDetan; if (mainForm.elementsStringToDetansMap.ContainsKey(keyString)) { numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan; denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan; } else { numeratorDetan = Calculations.getDetan(elementsListToZ); //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan; denominatorDetan = Calculations.getDetan(elementsListToQ); Calculations.correctFormule(ref numeratorDetan); Calculations.correctFormule(ref denominatorDetan); //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan; mainForm.elementsStringToDetansMap.Add( keyString, new DetansPair(numeratorDetan, denominatorDetan)); } //string detanZ = Calculations.getDetan(elementsListToZ); //Calculations.correctFormule(ref detanZ); //string detanQ = Calculations.getDetan(elementsListToQ); //Calculations.correctFormule(ref detanQ); string elementNames = Calculations.elementsToNamesString(associatedElements); elementsToDetanPairDictionary.Add(elementNames, new DetansPair(numeratorDetan, denominatorDetan)); detansCount += 2; if (Calculations.nextCombination(indexes, elements.Length) != 0) { break; } } } return(elementsToDetanPairDictionary); }
/* Нахождение пар определителей N и D для всех возможных сочетаний элементов */ /* из заданного набора elements */ /* Возвращает ассоциативный массив, где ключ - сочетание элементов, значение - пара определителей */ //static Dictionary<string, detansPair> getDetans( static Dictionary <string, DetansPair> getDetans( PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount) { Dictionary <string, DetansPair> elementsToDetanPairDictionary = new Dictionary <string, DetansPair>(); int elementsCount = elements.Length; List <Element> elementsList = new List <Element>(); foreach (PassiveElement element in scheme.passiveElementsList) { elementsList.Add(element); } List <Element> activeElementsForZ = scheme.activeElementsListForZ; List <Element> activeElementsForQ = scheme.activeElementsListForQ; foreach (PassiveElement element in elements) { elementsList.AddRange((element).clonnedElements); elementsList.Remove((element).cloneElement); } string selectedElementsString = elementsToNamesString(elements); //elementsList.AddRange(scheme.nullersList); /* Перебор длин сочетаний элементов */ for (int i = 0; i <= elementsCount; i++) { /* Первое сочетание данной длины */ int[] indexes = makeCombination(i); /* Перебор остальных сочетаний данной длины */ while (true) { List <Element> removedElements = new List <Element>(); List <Element> subtendedElements = new List <Element>(); List <Element> localElementsList = new List <Element>(elementsList); List <Element> associatedElements = new List <Element>(); /* Перебор элементов данного сочетания */ for (int j = 0; j < elementsCount; j++) { /* Нейтрализация или стягивание элемента */ if (Array.IndexOf(indexes, j + 1) >= 0) { scheme.transformElementToInfin((elements[j]).cloneElement, localElementsList); associatedElements.Add(elements[j]); removedElements.Add(elements[j]); } else { scheme.transformElementToZero((elements[j]).cloneElement, localElementsList); subtendedElements.Add(elements[j]); } } /* Далее - формирование списка элементов и рассчет определителей */ List <Element> elementsListToZ = new List <Element>(localElementsList); elementsListToZ.AddRange(activeElementsForZ); List <Element> elementsListToQ = new List <Element>(localElementsList); elementsListToQ.AddRange(activeElementsForQ); string pattern = "δ(%element%)"; string delimiter = ";"; string removedElementsString = elementsToNamesString(removedElements, pattern, delimiter); string keyString = selectedElementsString + "|" + removedElementsString; string numeratorDetan; string denominatorDetan; if (mainForm.elementsStringToDetansMap.ContainsKey(keyString)) { numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan; denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan; } else { numeratorDetan = getDetan(elementsListToZ); //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan; denominatorDetan = getDetan(elementsListToQ); correctFormule(ref numeratorDetan); correctFormule(ref denominatorDetan); //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan; mainForm.elementsStringToDetansMap.Add( keyString, new DetansPair(numeratorDetan, denominatorDetan)); } string elementsString = elementsToNamesString(associatedElements); elementsToDetanPairDictionary.Add(elementsString, new DetansPair(numeratorDetan, denominatorDetan)); detansCount += 2; if (nextCombination(indexes, elements.Length) != 0) { break; } } } return(elementsToDetanPairDictionary); }
static Dictionary<string, DetansPair> getDetans(PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount) { Dictionary<string, DetansPair> elementsToDetanPairDictionary = new Dictionary<string, DetansPair>(); int elementsCount = elements.Length; List<Element> elementsList = new List<Element>(); foreach (PassiveElement element in scheme.passiveElementsList) elementsList.Add(element); List<Element> activeElementsForZ = scheme.activeElementsListForZ; List<Element> activeElementsForQ = scheme.activeElementsListForQ; //elementsList.AddRange(scheme.nullersList); string selectedElementsString = Calculations.elementsToNamesString(elements); for (int i = 0; i <= elementsCount; i++) { int[] indexes = Calculations.makeCombination(i); while (true) { List<Element> removedElements = new List<Element>(); List<Element> subtendedElements = new List<Element>(); List<Element> localElementsList = new List<Element>(elementsList); List<Element> associatedElements = new List<Element>(); for (int j = 0; j < elementsCount; j++) { if (Array.IndexOf(indexes, j + 1) >= 0) { scheme.transformElementToInfin(elements[j], localElementsList); associatedElements.Add(elements[j]); removedElements.Add(elements[j]); } else { scheme.transformElementToZero(elements[j], localElementsList); subtendedElements.Add(elements[j]); } } List<Element> elementsListToZ = new List<Element>(localElementsList); elementsListToZ.AddRange(activeElementsForZ); List<Element> elementsListToQ = new List<Element>(localElementsList); elementsListToQ.AddRange(activeElementsForQ); string pattern = ""; string delimiter = ";"; string removedElementsString = Calculations.elementsToNamesString(removedElements, pattern, delimiter); string keyString = selectedElementsString + "|" + removedElementsString; string numeratorDetan; string denominatorDetan; if (mainForm.elementsStringToDetansMap.ContainsKey(keyString)) { numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan; denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan; } else { numeratorDetan = Calculations.getDetan(elementsListToZ); //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan; denominatorDetan = Calculations.getDetan(elementsListToQ); Calculations.correctFormule(ref numeratorDetan); Calculations.correctFormule(ref denominatorDetan); //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan; mainForm.elementsStringToDetansMap.Add( keyString, new DetansPair(numeratorDetan, denominatorDetan)); } //string detanZ = Calculations.getDetan(elementsListToZ); //Calculations.correctFormule(ref detanZ); //string detanQ = Calculations.getDetan(elementsListToQ); //Calculations.correctFormule(ref detanQ); string elementNames = Calculations.elementsToNamesString(associatedElements); elementsToDetanPairDictionary.Add(elementNames, new DetansPair(numeratorDetan, denominatorDetan)); detansCount += 2; if (Calculations.nextCombination(indexes, elements.Length) != 0) break; } } return elementsToDetanPairDictionary; }
/* Нахождение пар определителей N и D для всех возможных сочетаний элементов */ /* из заданного набора elements */ /* Возвращает ассоциативный массив, где ключ - сочетание элементов, значение - пара определителей */ //static Dictionary<string, detansPair> getDetans( static Dictionary<string, DetansPair> getDetans( PassiveElement[] elements, AdvancedScheme scheme, ref int detansCount) { Dictionary<string, DetansPair> elementsToDetanPairDictionary = new Dictionary<string, DetansPair>(); int elementsCount = elements.Length; List<Element> elementsList = new List<Element>(); foreach (PassiveElement element in scheme.passiveElementsList) { elementsList.Add(element); } List<Element> activeElementsForZ = scheme.activeElementsListForZ; List<Element> activeElementsForQ = scheme.activeElementsListForQ; foreach (PassiveElement element in elements) { elementsList.AddRange((element).clonnedElements); elementsList.Remove((element).cloneElement); } string selectedElementsString = elementsToNamesString(elements); //elementsList.AddRange(scheme.nullersList); /* Перебор длин сочетаний элементов */ for (int i = 0; i <= elementsCount; i++) { /* Первое сочетание данной длины */ int[] indexes = makeCombination(i); /* Перебор остальных сочетаний данной длины */ while (true) { List<Element> removedElements = new List<Element>(); List<Element> subtendedElements = new List<Element>(); List<Element> localElementsList = new List<Element>(elementsList); List<Element> associatedElements = new List<Element>(); /* Перебор элементов данного сочетания */ for (int j = 0; j < elementsCount; j++) { /* Нейтрализация или стягивание элемента */ if (Array.IndexOf(indexes, j + 1) >= 0) { scheme.transformElementToInfin((elements[j]).cloneElement, localElementsList); associatedElements.Add(elements[j]); removedElements.Add(elements[j]); } else { scheme.transformElementToZero((elements[j]).cloneElement, localElementsList); subtendedElements.Add(elements[j]); } } /* Далее - формирование списка элементов и рассчет определителей */ List<Element> elementsListToZ = new List<Element>(localElementsList); elementsListToZ.AddRange(activeElementsForZ); List<Element> elementsListToQ = new List<Element>(localElementsList); elementsListToQ.AddRange(activeElementsForQ); string pattern = "δ(%element%)"; string delimiter = ";"; string removedElementsString = elementsToNamesString(removedElements, pattern, delimiter); string keyString = selectedElementsString + "|" + removedElementsString; string numeratorDetan; string denominatorDetan; if (mainForm.elementsStringToDetansMap.ContainsKey(keyString)) { numeratorDetan = mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan; denominatorDetan = mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan; } else { numeratorDetan = getDetan(elementsListToZ); //mainForm.elementsStringToDetansMap[keyString].itsNumeratorDetan = numeratorDetan; denominatorDetan = getDetan(elementsListToQ); correctFormule(ref numeratorDetan); correctFormule(ref denominatorDetan); //mainForm.elementsStringToDetansMap[keyString].itsDenominatorDetan = denominatorDetan; mainForm.elementsStringToDetansMap.Add( keyString, new DetansPair(numeratorDetan,denominatorDetan)); } string elementsString = elementsToNamesString(associatedElements); elementsToDetanPairDictionary.Add(elementsString, new DetansPair(numeratorDetan, denominatorDetan)); detansCount += 2; if (nextCombination(indexes, elements.Length) != 0) break; } } return elementsToDetanPairDictionary; }