/// <summary> /// Initializes a new instance of the <see cref="PhantomChainGenerator"/> class. /// </summary> /// <param name="chain"> /// The chain. /// </param> /// <param name="generator"> /// The gen. /// </param> public PhantomChainGenerator(BaseChain chain, IGenerator generator) { this.generator = generator; var reorganizer = new SpacePhantomReorganizer(); var internalChain = (BaseChain)reorganizer.Reorganize(chain); for (int w = 0; w < internalChain.GetLength(); w++) { totalLength += ((ValuePhantom)internalChain[w])[0].ToString().Length; } ulong tempVariants = 1; int counter = 0; for (int k = 0; k < (int)Math.Ceiling((double)internalChain.GetLength() / BasicChainLength); k++) { tempChains.Add(new BaseChain()); tempChains[k].ClearAndSetNewLength(BasicChainLength); tree.Add(null); } // variants count calculation cycle for (int i = 0; i < tempChains.Count; i++) { for (int j = 0; j < tempChains[i].GetLength(); j++) { ValuePhantom tempMessage; if (counter < internalChain.GetLength()) { tempMessage = (ValuePhantom)internalChain[counter]; tempChains[i][j] = tempMessage; } else { tempMessage = new ValuePhantom { new ValueString('a') }; tempChains[i][j] = tempMessage; } tempVariants *= (uint)tempMessage.Cardinality; counter++; } if ((i != tempChains.Count - 1) || (tempChains.Count == 1)) { Variants = Math.Min(Variants, tempVariants); } tempVariants = 1; tree[i] = new TreeTop(tempChains[i], generator); } }
/// <summary> /// Generates given number of sequences. /// </summary> /// <param name="count"> /// Required sequences count. /// </param> /// <returns> /// Generated sequences. /// </returns> public List<BaseChain> Generate(ulong count) { if (count > Variants) { throw new Exception(); } var res = new List<BaseChain>(); var tempRes = new List<BaseChain>(); for (int m = 0; m < tree.Count; m++) { tempRes.Add(null); } generator.Reset(); int chainCounter = 0; while (res.Count != (uint)count) { int counter = 0; res.Add(new BaseChain(totalLength)); for (int l = 0; l < tree.Count; l++) { tempRes[l] = tree[l].Generate(); for (int u = 0; u < tempRes[l].GetLength(); u++) { if (counter < res[chainCounter].GetLength()) { res[chainCounter][counter] = tempRes[l][u]; counter++; } else { break; } } } chainCounter++; if (tree.Count != 1) { tree[tree.Count - 1] = new TreeTop(tempChains[tempChains.Count - 1], generator); } } for (int s = 0; s < tree.Count; s++) { tree[s] = new TreeTop(tempChains[s], generator); } return res; }