private void CalcF2ProbabilitiesGxyNew() { if (null != _probCalcF1) { return; } int resultsCount = 1 << _f2.OutputNumberOfDigits; Gprobabilites[] boolFunc2Gp = new Gprobabilites[resultsCount]; double[] f2ProbalityZero = new double[_f2.InputNumberOfDigits]; for (int i = 0; i < f2ProbalityZero.Length; i++) { f2ProbalityZero[i] = _inputDistortionProb.ZeroProbability[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits]; } var f2Calc = new ProbabilitiesGxyCalc(_f2, f2ProbalityZero); double[] probabilityZeroF1 = new double[_f1.InputNumberOfDigits]; // copy input zero probability for function f1 in range [1,..,t] for (int i = 0; i < _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits; i++) { probabilityZeroF1[i] = _inputDistortionProb.ZeroProbability[i]; } for (int i = 0; i < _f2.OutputNumberOfDigits; i++) { probabilityZeroF1[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits] = 0.0; } // create Gprobabilities for a separate bit of f2 function result const int BinaryDigitState = 2; Gprobabilites[][] digitSeparateProb = new Gprobabilites[BinaryDigitState][]; for (int i = 0; i < BinaryDigitState; i++) { digitSeparateProb[i] = new Gprobabilites[f2Calc.OutputNumberOfDigits()]; } // calc results probabilities int indexBoolFunc2Gp = 0; BitArray resultVect = new BitArray(_f2.OutputNumberOfDigits, false); // 00...0 do { boolFunc2Gp[indexBoolFunc2Gp] = f2Calc.GetGprobabilitesResult(resultVect); // calc G prob of separate bits of result for (int i = 0; i < digitSeparateProb[0].Length; i++) { int digit = resultVect[i] ? 1 : 0; digitSeparateProb[digit][i].G0 = boolFunc2Gp[indexBoolFunc2Gp].G0; digitSeparateProb[digit][i].Gc += boolFunc2Gp[indexBoolFunc2Gp].Gc; digitSeparateProb[digit][i].Gce += boolFunc2Gp[indexBoolFunc2Gp].Gce; digitSeparateProb[digit][i].Gee += boolFunc2Gp[indexBoolFunc2Gp].Gee; } ++indexBoolFunc2Gp; } while (BooleanFuntionWithInputDistortion.IncrementOperand(resultVect)); var prodClasses = new ProductClasses(_inputDistortionProb, digitSeparateProb, _f1.InputNumberOfDigits); _probCalcF1 = new ProbabilitiesGxyCalc(_f1, prodClasses); }
private void ViewResultButton_Click(object sender, EventArgs e) { LoadDistortionToBoolFunction(_bf, _inpDistProb); var pCalc = new ProbabilitiesGxyCalc(_bf, _inpDistProb.ZeroProbability); var f = new ResultView(pCalc); f.Visible = false; f.Show(); if (f.WindowState == FormWindowState.Minimized) { f.WindowState = FormWindowState.Normal; } }
private void button4_Click(object sender, EventArgs e) { /*int digitsInput = 4, digitsOutput = 1; * double[] distortionto1Probability = { 0.0, 0.0, 0.0, 0.0 }; * double[] distortionto0Probability = { 0.0, 0.0, 0.0, 0.0 }; * double[] distortiontoInverseProbability = { 0.5, 0.5, 0.5, 0.5 }; * double[] zeroProbability = { 0.5, 0.5, 0.5, 0.5 }; * string[] func = new string[1]; * func[0] = "(x[0] ^ x[1]) ^ (x[2] ^ x[3])"; * var f = new BooleanFunctionAnalytic(digitsInput, digitsOutput, func); * f.SetDistortionProbabilitiesVectors(distortionto0Probability, distortionto1Probability, distortiontoInverseProbability); * ProbabilitiesGxyCalc pGxy = new ProbabilitiesGxyCalc(f, zeroProbability); * var actual = pGxy.GetGprobabilitesResult(new BitArray(digitsOutput, true)); * var actual1 = pGxy.GetGprobabilitesResult(new BitArray(digitsOutput, false)); * var Ge = actual1.Gce + actual.Gce + actual1.Gee + actual.Gee; * var G = Ge + actual.G0 + actual.Gc + actual1.Gc; * string[] func1 = new string[1]; * string[] func2 = new string[1]; * func1[0] = "(x[0] ^ x[1]) ^ x[2]"; * func2[0] = "x[0] ^ x[1]"; * var digitsInputf1 = 3; * var digitsInputf2 = 2; * var f1 = new BooleanFunctionAnalytic(digitsInputf1, digitsOutput, func1); * var f2 = new BooleanFunctionAnalytic(digitsInputf2, digitsOutput, func2); * InputDistortionProbabilities inpDist = * new InputDistortionProbabilities(distortionto0Probability, distortionto1Probability, * distortiontoInverseProbability, zeroProbability); * ProbGxyCalcSuperposition pSprPos = new ProbGxyCalcSuperposition(f1, f2, inpDist); * var actual2 = pSprPos.GetGprobabilitesResult(new BitArray(digitsOutput, true)); * var actual3 = pSprPos.GetGprobabilitesResult(new BitArray(digitsOutput, false));*/ var f1 = new BooleanFunctionDelegate(6, 1, f6); var f2 = new BooleanFunctionDelegate(5, 1, f5); DistortionProbTextReader reader = new DistortionProbTextReader(@"D:\DiplomInput\InputDistortion10bitFANDOR.txt"); InputDistortionProbabilities inpDist = reader.GetDistortionProb(); ProbGxyCalcSuperposition pSprPos = new ProbGxyCalcSuperposition(f1, f2, inpDist); var actual2 = pSprPos.GetGprobabilitesResult(new BitArray(1, true)); var actual3 = pSprPos.GetGprobabilitesResult(new BitArray(1, false)); var GeS = actual2.Gce + actual3.Gce + actual2.Gee + actual3.Gee; var GS = GeS + actual2.G0 + actual2.Gc + actual3.Gc; var f = new BooleanFunctionDelegate(10, 1, f10); f.SetDistortionProbabilitiesVectors(inpDist); ProbabilitiesGxyCalc pGxy = new ProbabilitiesGxyCalc(f, inpDist.ZeroProbability); //var actual = pGxy.GetGprobabilitesResult(new BitArray(1, true)); //var actual1 = pGxy.GetGprobabilitesResult(new BitArray(1, false)); //var Ge = actual1.Gce + actual.Gce + actual1.Gee + actual.Gee; //var G = Ge + actual.G0 + actual.Gc + actual1.Gc; }
public ProbGxyCalcSuperposition(BooleanFuntionWithInputDistortion truthTable1, BooleanFuntionWithInputDistortion truthTable2, InputDistortionProbabilities inputDistortionProb) { _f1 = truthTable1; _f2 = truthTable2; if (inputDistortionProb.ZeroProbability.Length != _f1.InputNumberOfDigits + _f2.InputNumberOfDigits - _f2.OutputNumberOfDigits) { throw new Exception("Size of probalityZero array don't fit the InputNumberOfDigits of truth table composition."); } _inputDistortionProb = inputDistortionProb; // copy distortion for f2 LoadDistortionToBoolFunction(_f2, _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits, _f2.InputNumberOfDigits); LoadDistortionToBoolFunction(_f1, 0, _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits); _probCalcF1 = null; }
private void CalcF2ProbabilitiesGxy() { if (null != _probCalcF1) { return; } int resultsCount = 1 << _f2.OutputNumberOfDigits; Gprobabilites[] boolFunc2Gp = new Gprobabilites[resultsCount]; double[] f2ProbalityZero = new double[_f2.InputNumberOfDigits]; for (int i = 0; i < f2ProbalityZero.Length; i++) { f2ProbalityZero[i] = _inputDistortionProb.ZeroProbability[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits]; } var f2Calc = new ProbabilitiesGxyCalc(_f2, f2ProbalityZero); double[] probabilityZeroF1 = new double[_f1.InputNumberOfDigits]; // copy input zero probability for function f1 in range [1,..,t] for (int i = 0; i < _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits; i++) { probabilityZeroF1[i] = _inputDistortionProb.ZeroProbability[i]; } for (int i = 0; i < _f2.OutputNumberOfDigits; i++) { probabilityZeroF1[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits] = 0.0; } // get zero probability int indexBoolFunc2Gp = 0; BitArray resultVect = new BitArray(_f2.OutputNumberOfDigits, false); // 00...0 do { boolFunc2Gp[indexBoolFunc2Gp] = f2Calc.GetGprobabilitesResult(resultVect); // calc input zero probability for function f1 in range [t+1,..., t+_f2.OutputNumberOfDigits] for (int i = 0; i < _f2.OutputNumberOfDigits; i++) { if (!resultVect[i]) // if res[i] == 0 { probabilityZeroF1[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits] += boolFunc2Gp[indexBoolFunc2Gp].SumCorrectionAndError(); // sum without G0 } } ++indexBoolFunc2Gp; } while (BooleanFuntionWithInputDistortion.IncrementOperand(resultVect)); // add G0 for (int i = 0; i < _f2.OutputNumberOfDigits; i++) { probabilityZeroF1[i + _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits] += boolFunc2Gp[0].G0 / _f2.Length; } // get distortion prob const int DistortionTypes = 3; double[][] distProb = new double[DistortionTypes][]; for (int r = 0; r < distProb.Length; r++) { distProb[r] = new double[_f1.InputNumberOfDigits]; for (int i = 0; i < _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits; i++) { distProb[r][i] = _f1.ProbabilityVectors[r + 1][i]; } int indexBase = _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits; for (int i = 0; i < _f2.OutputNumberOfDigits; i++) { distProb[r][indexBase + i] = 0; } } indexBoolFunc2Gp = 0; resultVect = new BitArray(_f2.OutputNumberOfDigits, false); // 00...0 do { int indexBase = _f1.InputNumberOfDigits - _f2.OutputNumberOfDigits; for (int i = 0; i < resultVect.Length; i++) { double bitProb = 0.0; if (resultVect[i]) // distortionTo1 { bitProb = 1 - probabilityZeroF1[indexBase + i]; distProb[1][i + indexBase] += (boolFunc2Gp[indexBoolFunc2Gp].Gc + boolFunc2Gp[indexBoolFunc2Gp].Gce);// / bitProb; } else // distortionTo0 { bitProb = probabilityZeroF1[indexBase + i]; distProb[0][i + indexBase] += (boolFunc2Gp[indexBoolFunc2Gp].Gc + boolFunc2Gp[indexBoolFunc2Gp].Gce); // / bitProb; } distProb[DistortionTypes - 1][i + indexBase] += boolFunc2Gp[indexBoolFunc2Gp].Gee; // / (1 - bitProb); } ++indexBoolFunc2Gp; } while (BooleanFuntionWithInputDistortion.IncrementOperand(resultVect)); // Set zero prob and dist prob to _f1 _f1.DistortionToZeroProbability = distProb[0]; _f1.DistortionToOneProbability = distProb[1]; _f1.DistortionToInverseProbability = distProb[2]; _f1.CorrectValueProbability = null; double[] correctValueProbability = new double[_f1.InputNumberOfDigits]; double[][] autoCorrectionValueProbability = null; double[][] distortedValueProbability = null; AllocateDeterminedDistortionProbalilitiesVectors(ref autoCorrectionValueProbability); AllocateDeterminedDistortionProbalilitiesVectors(ref distortedValueProbability); _probCalcF1 = new ProbabilitiesGxyCalc(_f1, probabilityZeroF1); }