Beispiel #1
0
        public void Split(byte[] text, Range withinRange, RangeSet result)
        {
            if (result == null)
            {
                throw new ArgumentNullException("result");
            }
            if (text == null)
            {
                return;
            }

            int lastGroup = withinRange.Index;
            int end       = withinRange.Index + withinRange.Length;
            int i;

            for (i = withinRange.Index; i < end; ++i)
            {
                byte c = text[i];

                if (c == UTF8.Semicolon)
                {
                    result.Add(lastGroup, i - lastGroup);
                    lastGroup = i + 1;
                    if (lastGroup < end && text[lastGroup] == UTF8.Space)
                    {
                        lastGroup++;
                    }
                }
            }

            // Include the last value
            result.Add(lastGroup, i - lastGroup);
        }
Beispiel #2
0
 public void MessageTransfer(IMessage m)
 {
     _range.Clear();
     _range.Add(m.Id);
     _session.MessageAccept(_range);
     _buffer.Enqueue(m);
 }
        private double processRate(int size, string queue)
        {
            CircularBuffer <IMessage> buffer   = new CircularBuffer <IMessage>(100);
            IMessageListener          listener = new SyncListener(buffer);
            string localQueue = "queue-" + UUID.RandomUuid();

            Session.QueueDeclare(localQueue, null, null, Option.AUTO_DELETE);
            Session.ExchangeBind(localQueue, "amq.direct", queue);
            Session.AttachMessageListener(listener, localQueue);
            Session.MessageSubscribe(localQueue);
            double   rate  = 0;
            RangeSet range = new RangeSet();

            for (int i = 0; i < size; ++i)
            {
                IMessage m = buffer.Dequeue();
                range.Add(m.Id);
                BinaryReader reader = new BinaryReader(m.Body, Encoding.UTF8);
                byte[]       body   = new byte[m.Body.Length - m.Body.Position];
                reader.Read(body, 0, body.Length);
                rate += BitConverter.ToDouble(body, 0);
            }
            Session.MessageAccept(range);
            return(rate);
        }
            public IAcceptInputTransition <string> ActivateRegexNFATransitionFromRegexCondition(RegexCondition <string> regex)
            {
                if (regex == null)
                {
                    throw new ArgumentNullException(nameof(regex));
                }

                RangeSet <string> set = new RangeSet <string>(this.rangeInfo);

                if (regex is RegexConst <string> regexConst)
                {
                    set.Add(regexConst.ConstValue);
                }
                else if (regex is RegexRange <string> regexRange)
                {
                    set.AddRange(regexRange.Minimum, regexRange.Maximum, regexRange.CanTakeMinimum, regexRange.CanTakeMaximum);
                }
                else if (regex is IRange <string> range)
                {
                    set.AddRange(range.Minimum, range.Maximum, range.CanTakeMinimum, range.CanTakeMaximum);
                }
                else
                {
                    throw new NotSupportedException();
                }

                return(new RangeSetRegexFATransition <string, BasicRegexNFAState <string> >(set));
            }
        /// <summary>
        /// モーションオブジェクトの欠損/被欠損の情報をフレーム単位で取得する
        /// </summary>
        /// <param name="id">情報を取得するさきのオブジェクトのId</param>
        /// <returns></returns>
        private RangeSet <int> getExistenceList(uint id)
        {
            MotionDataSet dataSet = _dataSet;

            if (dataSet == null)
            {
                return(null);
            }
            RangeSet <int> ret;

            if (_existenceList.TryGetValue(id, out ret))
            {
                return(ret);
            }
            try {
                ret = new RangeSet <int>();
                int index = 0;
                foreach (var frame in dataSet.EnumerateFrame())
                {
                    if (frame[id] != null)
                    {
                        ret.Add(new RangeSet <int> .Range(index, index + 1));
                    }
                    index++;
                }
                _existenceList[id] = ret;
                return(ret);
            } catch { return(null); }
        }
 public void MessageTransfer(IMessage m)
 {
     byte[] body = new byte[m.Body.Length - m.Body.Position];
     _log.Debug("Got a message of size: " + body.Length + " count = " + _count);
     _rs.Add(m.Id);
     lock (_wl)
     {
         _count--;
         if (_count == 0)
         {
             Monitor.PulseAll(_wl);
         }
     }
 }
        public RangeSet ReadSequenceSet()
        {
            int count = ReadUint16() / 8;

            if (count == 0)
            {
                return(null);
            }
            RangeSet ranges = new RangeSet();

            for (int i = 0; i < count; i++)
            {
                ranges.Add(ReadSequenceNo(), ReadSequenceNo());
            }
            return(ranges);
        }
Beispiel #8
0
        public void MessageTransfer(IMessage m)
        {
            foreach (int i in _topics)
            {
                if (_excel.TopicMessages.ContainsKey(i))
                {
                    _excel.TopicMessages[i] = m;
                }
            }
            // ack this message
            RangeSet rs = new RangeSet();

            rs.Add(m.Id);
            _excel.Session.MessageAccept(rs);
            _excel.OnMessage.UpdateNotify();
        }
        public void MessageTransfer(IMessage request)
        {
            IMessage response = new Message();

            // Get routing key for response from the request's replyTo property
            string routingKey;

            if (request.MessageProperties.HasReplyTo())
            {
                routingKey = request.MessageProperties.GetReplyTo().GetRoutingKey();
            }
            else
            {
                Console.WriteLine("Error: \n No routing key for request " + request);
                return;
            }

            BinaryReader reader = new BinaryReader(request.Body, Encoding.UTF8);

            byte[] body = new byte[request.Body.Length - request.Body.Position];
            reader.Read(body, 0, body.Length);
            ASCIIEncoding enc     = new ASCIIEncoding();
            string        message = enc.GetString(body);

            Console.WriteLine("Request: " + message);

            // Transform message content to upper case
            string responseBody = message.ToUpper();

            // Send it back to the user
            response.ClearData();
            response.AppendData(Encoding.UTF8.GetBytes(responseBody));
            _session.MessageTransfer("amq.direct", routingKey, response);

            // Add this message to the list of message to be acknowledged
            _range.Add(request.Id);
            if (message.Equals("That's all, folks!"))
            {
                // Acknowledge all the received messages
                _session.MessageAccept(_range);
                lock (_session)
                {
                    Monitor.Pulse(_session);
                }
            }
        }
        public void CanAddAndFind()
        {
            var rangeSet = new RangeSet <int>(0);

            for (var i = 10; i <= 1000; i += 10)
            {
                rangeSet.Add(i, i);
            }

            for (var i = 0; i < 1000; i += 3)
            {
                int n;
                var r = rangeSet.TryFind(i, out n);

                Assert.That(r, Is.True);
                Assert.That(n, Is.EqualTo(i + 10 - i % 10.0).Or.EqualTo(i - i % 10.0));
            }
        }
Beispiel #11
0
        public void DebugDump()
        {
            RangeSet rangeSet = new RangeSet();

            for (int i = 0; i < mSelection.Length; i++)
            {
                if (mSelection[i])
                {
                    rangeSet.Add(i);
                }
            }
            Debug.WriteLine("VirtualListViewSelection ranges:");
            IEnumerator <RangeSet.Range> iter = rangeSet.RangeListIterator;

            while (iter.MoveNext())
            {
                RangeSet.Range range = iter.Current;
                Debug.WriteLine(" [" + range.Low.ToString() + "," + range.High.ToString() + "]");
            }
        }
Beispiel #12
0
        public void MessageTransfer(IMessage m)
        {
            BinaryReader reader = new BinaryReader(m.Body, Encoding.UTF8);

            byte[] body = new byte[m.Body.Length - m.Body.Position];
            reader.Read(body, 0, body.Length);
            ASCIIEncoding enc     = new ASCIIEncoding();
            string        message = enc.GetString(body);

            Console.WriteLine("Message: " + message);
            // Add this message to the list of message to be acknowledged
            _range.Add(m.Id);
            if (message.Equals("That's all, folks!"))
            {
                // Acknowledge all the received messages
                _session.MessageAccept(_range);
                lock (_session)
                {
                    Monitor.Pulse(_session);
                }
            }
        }
        public void MessageTransfer(IMessage m)
        {
            _counter++;
            BinaryReader reader = new BinaryReader(m.Body, Encoding.UTF8);

            byte[] body = new byte[m.Body.Length - m.Body.Position];
            reader.Read(body, 0, body.Length);
            ASCIIEncoding enc     = new ASCIIEncoding();
            string        message = enc.GetString(body);

            Console.WriteLine("Response: " + message);
            // Add this message to the list of message to be acknowledged
            _range.Add(m.Id);
            if (_counter == 4)
            {
                Console.WriteLine("Shutting down listener for " + m.DeliveryProperties.GetRoutingKey());
                // Acknowledge all the received messages
                _session.MessageAccept(_range);
                lock (_session)
                {
                    Monitor.Pulse(_session);
                }
            }
        }
        public void Operate(IList <MotionObjectInfo> selectedInfoList, IList <ProcParam <MotionProcEnv> > args, MotionDataSet dataSet, ProgressInformation progressInfo)
        {
            SingleSelectParameter mode   = args[0] as SingleSelectParameter;
            NumberParameter       limit2 = args[1] as NumberParameter;
            bool addMode = mode.Value == 1;
            int  limit   = (int)limit2.Value;

            progressInfo.Initialize(selectedInfoList.Count, "Interpolate");
            foreach (var info in selectedInfoList)
            {
                // 欠落範囲の集合
                RangeSet <int> missings = new RangeSet <int>();

                bool exist = true;
                int  begin = 0;
                // 最初のフレームからかけている部分,最後のかけている部分は無視
                for (int i = 0; i < dataSet.FrameLength; i++)
                {
                    if (dataSet.GetFrameByIndex(i)[info] == null)
                    {
                        if (exist)
                        {
                            begin = i;
                            exist = false;
                        }
                    }
                    else
                    {
                        if (!exist)
                        {
                            if (begin != 0)
                            {
                                missings.Add(new RangeSet <int> .Range(begin, i));
                                exist = true;
                            }
                        }
                    }
                }
                // 別オブジェクトにするとき用に入力オブジェクトと出力オブジェクトを分ける
                MotionObjectInfo addInfo = info;
                if (addMode)
                {
                    // 別オブジェクトにするオプション
                    addInfo      = new MotionObjectInfo(info.ObjectType, info);
                    addInfo.Name = PathEx.GiveName("interpolate", info.Name);
                    dataSet.AddObject(addInfo);
                }
                // 線形補間
                foreach (var range in missings)
                {
                    if (limit == 0 || range.End - range.Start <= limit)
                    {
                        int          pre       = range.Start - 1;
                        int          post      = range.End;
                        MotionFrame  preFrame  = dataSet.GetFrameByIndex(pre);
                        MotionFrame  postFrame = dataSet.GetFrameByIndex(post);
                        MotionObject preObject = preFrame[info];
                        if (preObject != null)
                        {
                            for (int index = range.Start; index < range.End; index++)
                            {
                                float       interpolater = (float)(index - pre) / (post - pre);
                                MotionFrame frame        = dataSet.GetFrameByIndex(index);
                                frame[addInfo] = preObject.InterpolateLinear(postFrame[info], interpolater);
                            }
                        }
                    }
                }
                progressInfo.CurrentValue++;
            }

            dataSet.DoFrameListChanged();
            if (addMode)
            {
                dataSet.DoObjectInfoSetChanged();
            }
        }
Beispiel #15
0
 public RangeSet ReadSequenceSet()
 {
     int count = ReadUint16()/8;
     if (count == 0)
     {
         return null;
     }
     RangeSet ranges = new RangeSet();
     for (int i = 0; i < count; i++)
     {
         ranges.Add(ReadSequenceNo(), ReadSequenceNo());
     }
     return ranges;
 }
Beispiel #16
0
 public void MessageTransfer(IMessage m)
 {            
     foreach (int i in _topics)
     {
         if (_excel.TopicMessages.ContainsKey(i))
         {
             _excel.TopicMessages[i] = m;
         }
     }
     // ack this message 
     RangeSet rs = new RangeSet();
     rs.Add(m.Id);
     _excel.Session.MessageAccept(rs);        
     _excel.OnMessage.UpdateNotify();
 }
        public override void Start()
        {
            if (Options.Tx > 0)
            {
                Session.TxSelect();
                Session.Sync();
            }
            CircularBuffer <IMessage> buffer = new CircularBuffer <IMessage>(100);
            // Create a listener and subscribe it to the queue named "message_queue"
            IMessageListener listener = new SyncListener(buffer);

            string dest = "dest" + UUID.RandomUuid();

            Session.AttachMessageListener(listener, dest);
            Session.MessageSubscribe(_queue, dest,
                                     Options.Tx > 0 || Options.SubAck > 0
                                         ? MessageAcceptMode.EXPLICIT
                                         : MessageAcceptMode.NONE,
                                     MessageAcquireMode.PRE_ACQUIRED, null, 0, null);
            // issue credits
            Session.MessageSetFlowMode(dest, MessageFlowMode.WINDOW);
            Session.MessageFlow(dest, MessageCreditUnit.BYTE, ClientSession.MESSAGE_FLOW_MAX_BYTES);

            // Notify controller we are ready.
            IMessage message = new Message();

            message.DeliveryProperties.SetRoutingKey("sub_ready");

            message.AppendData(Encoding.UTF8.GetBytes("ready"));
            Session.MessageTransfer("amq.direct", message);

            if (Options.Tx > 0)
            {
                Session.TxCommit();
                Session.Sync();
            }


            for (int j = 0; j < Options.Iterations; ++j)
            {
                //need to allocate some more credit
                Session.MessageFlow(dest, MessageCreditUnit.MESSAGE, (long)Options.SubQuota);

                RangeSet range = new RangeSet();
                IMessage msg;
                DateTime start = DateTime.Now;
                for (long i = 0; i < Options.SubQuota; ++i)
                {
                    msg = buffer.Dequeue();
                    if (Options.Tx > 0 && ((i + 1) % Options.Tx == 0))
                    {
                        Session.TxCommit();
                        Session.Sync();
                    }
                    if (Options.IntervalSub > 0)
                    {
                        Thread.Sleep((int)Options.IntervalSub * 1000);
                    }
                    range.Add(msg.Id);
                }
                if (Options.Tx > 0 || Options.SubAck > 0)
                {
                    Session.MessageAccept(range);
                }
                range.Clear();
                if (Options.Tx > 0)
                {
                    Session.TxSelect();
                    Session.Sync();
                }
                DateTime end = DateTime.Now;

                // Report to publisher.
                message.DeliveryProperties.SetRoutingKey("sub_done");
                message.ClearData();
                message.AppendData(BitConverter.GetBytes(Options.SubQuota / end.Subtract(start).TotalMilliseconds));
                Session.MessageTransfer("amq.direct", message);
                if (Options.Tx > 0)
                {
                    Session.TxSelect();
                    Session.Sync();
                }
            }
            Session.Close();
        }
Beispiel #18
0
 public void KnownComplete(RangeSet kc)
 {
     lock (_processedLock)
     {
         RangeSet newProcessed = new RangeSet();
         foreach (Range pr in _processed)
         {
             foreach (Range kr in kc)
             {
                 foreach (Range r in pr.Subtract(kr))
                 {
                     newProcessed.Add(r);
                 }
             }
         }
         _processed = newProcessed;
     }
 }
        public void Split(byte[] text, Range withinRange, RangeSet result)
        {
            if (result == null)
            {
                throw new ArgumentNullException("result");
            }

            if (text == null)
            {
                return;
            }

            bool inGroup     = false;
            int  dottedStart = -1;
            int  alphaStart  = -1;

            int end = withinRange.Index + withinRange.Length;
            int i;

            for (i = withinRange.Index; i < end; ++i)
            {
                byte c = text[i];

                bool isDigit        = (c >= UTF8.Zero && c <= UTF8.Nine);
                bool isUpper        = (c >= UTF8.A && c <= UTF8.Z);
                bool isLower        = (c >= UTF8.a && c <= UTF8.z);
                bool isAlphaNumeric = (isDigit || isUpper || isLower);

                if (!inGroup)
                {
                    // If we're not in a dotted group and we see an alpha character, start all machines.
                    if (isAlphaNumeric)
                    {
                        inGroup     = true;
                        dottedStart = i;
                        alphaStart  = i;
                    }
                }
                else
                {
                    if (!isAlphaNumeric)
                    {
                        // Non-alpha - capture in progress alpha word.
                        result.Add(alphaStart, i - alphaStart);

                        if (c != UTF8.Period)
                        {
                            // We've left the group. Capture dotted group also if unique.
                            if (alphaStart != dottedStart)
                            {
                                result.Add(dottedStart, i - dottedStart);
                            }
                            inGroup = false;
                        }
                        else
                        {
                            // Just a new dotted string part. Pre-start the next alpha word at the next character
                            alphaStart = i + 1;
                        }
                    }
                }
            }

            // Include in progress alpha and dotted words
            if (inGroup)
            {
                result.Add(alphaStart, i - alphaStart);
                if (alphaStart != dottedStart)
                {
                    result.Add(dottedStart, i - dottedStart);
                }
            }
        }
Beispiel #20
0
 private double processRate(int size, string queue)
 {
     CircularBuffer<IMessage> buffer = new CircularBuffer<IMessage>(100);
     IMessageListener listener = new SyncListener(buffer);
     string localQueue = "queue-" + UUID.RandomUuid();
     Session.QueueDeclare(localQueue, null, null, Option.AUTO_DELETE);
     Session.ExchangeBind(localQueue, "amq.direct", queue);
     Session.AttachMessageListener(listener, localQueue);
     Session.MessageSubscribe(localQueue);
     double rate = 0;
     RangeSet range = new RangeSet();
     for (int i = 0; i < size; ++i)
     {
         IMessage m = buffer.Dequeue();
         range.Add(m.Id);
         BinaryReader reader = new BinaryReader(m.Body, Encoding.UTF8);
         byte[] body = new byte[m.Body.Length - m.Body.Position];
         reader.Read(body, 0, body.Length);
         rate += BitConverter.ToDouble(body,0);
     }
     Session.MessageAccept(range);
     return rate;
 }
Beispiel #21
0
        public override void Start()
        {
            if (Options.Tx > 0)
            {
                Session.TxSelect();
                Session.Sync();
            }
            CircularBuffer<IMessage> buffer = new CircularBuffer<IMessage>(100);
            // Create a listener and subscribe it to the queue named "message_queue"
            IMessageListener listener = new SyncListener(buffer);

            string dest = "dest" + UUID.RandomUuid();
            Session.AttachMessageListener(listener, dest);
            Session.MessageSubscribe(_queue, dest,
                                     Options.Tx > 0 || Options.SubAck > 0
                                         ? MessageAcceptMode.EXPLICIT
                                         : MessageAcceptMode.NONE,
                                     MessageAcquireMode.PRE_ACQUIRED, null, 0, null);
            // issue credits     
            Session.MessageSetFlowMode(dest, MessageFlowMode.WINDOW);
            Session.MessageFlow(dest, MessageCreditUnit.BYTE, ClientSession.MESSAGE_FLOW_MAX_BYTES);

            // Notify controller we are ready.
            IMessage message = new Message();
            message.DeliveryProperties.SetRoutingKey("sub_ready");

            message.AppendData(Encoding.UTF8.GetBytes("ready"));
            Session.MessageTransfer("amq.direct", message);

            if (Options.Tx > 0)
            {
                Session.TxCommit();
                Session.Sync();
            }


            for (int j = 0; j < Options.Iterations; ++j)
            {
               
                //need to allocate some more credit
                Session.MessageFlow(dest, MessageCreditUnit.MESSAGE, (long)Options.SubQuota);
                
                RangeSet range = new RangeSet();
                IMessage msg;
                DateTime start = DateTime.Now;
                for (long i = 0; i < Options.SubQuota; ++i)
                {                   
                    msg = buffer.Dequeue();
                    if (Options.Tx > 0 && ((i + 1)%Options.Tx == 0))
                    {
                        Session.TxCommit();
                        Session.Sync();
                    }
                    if (Options.IntervalSub > 0)
                    {
                        Thread.Sleep((int) Options.IntervalSub*1000);
                    }
                    range.Add(msg.Id);
                }
                if (Options.Tx > 0 || Options.SubAck > 0)
                    Session.MessageAccept(range);
                range.Clear();
                if (Options.Tx > 0)
                {
                    Session.TxSelect();
                    Session.Sync();
                }
                DateTime end = DateTime.Now;

                // Report to publisher.
                message.DeliveryProperties.SetRoutingKey("sub_done");
                message.ClearData();
                message.AppendData(BitConverter.GetBytes(Options.SubQuota / end.Subtract(start).TotalMilliseconds ));
                Session.MessageTransfer("amq.direct", message);
                if (Options.Tx > 0)
                {
                    Session.TxSelect();
                    Session.Sync();
                }
            }
            Session.Close();
        }
Beispiel #22
0
		public void MessageTransfer(IMessage msg) {
			MSDecoder decoder = new MSDecoder() ;
			decoder.Init(msg.Body) ;
			RangeSet rangeSet = new RangeSet() ;
			rangeSet.Add(msg.Id) ;
			char opcode = 'x' ;
			long seq = -1 ;
			while (this.CheckHeader(decoder, out opcode, out seq)) {
				//log.Debug("Message recieved with opcode " + opcode + " and sequence " + seq) ;
				//log.Debug(System.Text.Encoding.UTF8.GetString(msg.Body.ToArray())) ;
				switch (opcode) {
					case 'b':
						consoleSession.HandleBrokerResponse(this, decoder, seq) ;
						break ;
					case 'p':
						consoleSession.HandlePackageIndicator(this, decoder, seq) ;
						break ;		
					case 'z':
						consoleSession.HandleCommandComplete(this, decoder, seq) ;
						break ;		
					case 'q':
						consoleSession.HandleClassIndicator(this, decoder, seq) ;
						break ;			
					case 'm':
						consoleSession.HandleMethodResponse(this, decoder, seq) ;
						break ;							
					case 'h':
						consoleSession.HandleHeartbeatIndicator(this, decoder, seq, msg) ;
						break ;						
					case 'e':
						consoleSession.HandleEventIndicator(this, decoder, seq) ;
						break ;							
					case 's':
						consoleSession.HandleSchemaResponse(this, decoder, seq) ;
						break ;			
					case 'c':
						consoleSession.HandleContentIndicator(this, decoder, seq, true, false) ;
						break ;	
					case 'i':
						consoleSession.HandleContentIndicator(this, decoder, seq, false, true) ;
						break ;		
					case 'g':
						consoleSession.HandleContentIndicator(this, decoder, seq, true, true) ;
						break ;			
					default:
						log.Error("Invalid message type recieved with opcode " + opcode) ;
						break ;
				}		
			} 
			lock (lockObject) {
				outSession.MessageAccept(rangeSet) ;
			}
		}
Beispiel #23
0
        public void MessageTransfer(IMessage msg)
        {
            MSDecoder decoder = new MSDecoder();

            decoder.Init(msg.Body);
            RangeSet rangeSet = new RangeSet();

            rangeSet.Add(msg.Id);
            char opcode = 'x';
            long seq    = -1;

            while (this.CheckHeader(decoder, out opcode, out seq))
            {
                //log.Debug("Message recieved with opcode " + opcode + " and sequence " + seq) ;
                //log.Debug(System.Text.Encoding.UTF8.GetString(msg.Body.ToArray())) ;
                switch (opcode)
                {
                case 'b':
                    consoleSession.HandleBrokerResponse(this, decoder, seq);
                    break;

                case 'p':
                    consoleSession.HandlePackageIndicator(this, decoder, seq);
                    break;

                case 'z':
                    consoleSession.HandleCommandComplete(this, decoder, seq);
                    break;

                case 'q':
                    consoleSession.HandleClassIndicator(this, decoder, seq);
                    break;

                case 'm':
                    consoleSession.HandleMethodResponse(this, decoder, seq);
                    break;

                case 'h':
                    consoleSession.HandleHeartbeatIndicator(this, decoder, seq, msg);
                    break;

                case 'e':
                    consoleSession.HandleEventIndicator(this, decoder, seq);
                    break;

                case 's':
                    consoleSession.HandleSchemaResponse(this, decoder, seq);
                    break;

                case 'c':
                    consoleSession.HandleContentIndicator(this, decoder, seq, true, false);
                    break;

                case 'i':
                    consoleSession.HandleContentIndicator(this, decoder, seq, false, true);
                    break;

                case 'g':
                    consoleSession.HandleContentIndicator(this, decoder, seq, true, true);
                    break;

                default:
                    log.Error("Invalid message type recieved with opcode " + opcode);
                    break;
                }
            }
            lock (lockObject) {
                outSession.MessageAccept(rangeSet);
            }
        }
        static void Main(string[] args)
        {
            Program.TestFunctionalTransitions(
                Regex.Range('0', '9').NoneOrMany().NonGreedy() +
                Regex.Range('0', '9').Many().NonGreedy().Group("sec", true).GroupReference(out RegexGroupReference <char> sec_GroupReference) +
                sec_GroupReference
                );

#if false
            RangeSet <char> set = new RangeSet <char>(new CharRangeInfo());
            set.Add('a');
            set.Add('c');
            ;

            Dictionary <int, int> d = new Dictionary <int, int>();
            var chars  = Regex.Range('\0', 'z', true, false);
            var tchars = Regex.Range(new TT <char>('a'), new TT <char>('z'), false, true);

            var phone = Regex.Range(0, 9).RepeatMany(10);

            Func <int, RegexObject <char> > func = (count) =>
            {
                var junkPrefix             = Regex.Const('0').NoneOrMany();
                Func <int, char> convertor = Convert.ToChar;
                return(junkPrefix + Enumerable.Range(0, count).Select(num => num.ToString().Select(c => Regex.Const(c)).ConcatMany()).UnionMany());
            };
            var section = func(255);
            var dot = Regex.Const('.');
            var colon = Regex.Const(':');
            var port = func(9999);
            var ipAddress = new RegexObject <char>[] { section, dot, section, dot, section, dot, section, new RegexObject <char>[] { colon, port }.ConcatMany().Optional() }.ConcatMany();

            IRegexFAProvider <char> char_Provider = new RegexFAProvider <char>(new MyCharRegexRunContextInfo());

            var char_nfa = char_Provider.GenerateRegexFSMFromRegexObject(ipAddress, RegexOptions.None);
            //var debuginfo = char_nfa.GetDebugInfo();
            var char_dfa = char_Provider.GenerateRegexDFAFromRegexFSM(char_nfa);
            ;

            Action <RegexObject <char> > action =
                regexObj =>
            {
                var ___nfa = char_Provider.GenerateRegexFSMFromRegexObject(regexObj, RegexOptions.None);
                var ___dfa = char_Provider.GenerateRegexDFAFromRegexFSM(___nfa);

                IEnumerable <char> inputs       = Enumerable.Repeat <Func <int, int> >(new Random().Next, 25).Select(nextFunc => (char)('a' - 1 + nextFunc(4)));
                char[]             ___charArray = inputs.ToArray();
                IRegexFSM <char>   ___fsm;
#if false
                ___fsm = new RegexFSM <char>()
                {
                    StartState = ___dfa.StartState
                };
#else
                ___fsm = ___dfa;
#endif
                ___fsm.TransitMany(___charArray);

                var ___matches = ___fsm.Matches;
            };
            action?.Invoke(Regex.Const('a').Optional().Concat(Regex.Const('b').Concat(Regex.Const('c').Optional())));
#endif

            Func <int, int, RegexRange <string> > func_adpator = (min, max) =>
                                                                 new RegexRangeAdaptor <int, string>(
                min, max,
                (source => source.ToString()),
                (target => int.Parse(target))
                );
            var section_adpator = func_adpator(0, 255);
            var dot_adaptor     = new RegexConstAdaptor <char, string>('.', (source => source.ToString()), (target => target[0]));
            var colon_adaptor   = new RegexConstAdaptor <char, string>(':', (source => source.ToString()), (target => target[0]));
            var port_adaptor    = func_adpator(0, 9999);

            var ipAddress_adaptor =
                new RegexObject <string>[] { section_adpator, dot_adaptor, section_adpator, dot_adaptor, section_adpator, dot_adaptor, section_adpator, new RegexObject <string>[] { colon_adaptor, port_adaptor }.ConcatMany().Optional() }.ConcatMany();

            IRegexFAProvider <string> string_Provider = new RegexFAProvider <string>(new MyStringRegexRunContextInfo());

            var string_nfa = string_Provider.GenerateRegexFSMFromRegexObject(ipAddress_adaptor, RegexOptions.None);
            var string_dfa = string_Provider.GenerateRegexDFAFromRegexFSM(string_nfa);
            ;

            Random random = new Random();
            int    样本树    = 100;
            var    ipAddressStrFragments =
                Enumerable.Repeat(
                    new Tuple <Func <int>, Func <double> >(
                        (() => random.Next(4, 6)),
                        (() => random.NextDouble() * 1.15)
                        ),
                    样本树
                    )
                .Select(tuple =>
            {
                int groupCount = tuple.Item1();
                int sectionMax = 255;
                int portMax    = 9999;
                return
                (Enumerable.Repeat <IEnumerable <string> >(
                     new string[]
                {
                    ((int)(sectionMax * tuple.Item2())).ToString(),
                    "."
                },
                     3)
                 .Aggregate((ss1, ss2) => ss1.Concat(ss2))
                 .Concat(groupCount > 3 ?
                         new string[] { ((int)(sectionMax * tuple.Item2())).ToString() }
                         .Concat(groupCount > 4 ?
                                 new string[]
                {
                    ":",
                    ((int)(portMax * tuple.Item2())).ToString()
                } :
                                 Enumerable.Empty <string>()
                                 ) :
                         Enumerable.Empty <string>()
                         ));
            });
#if false
            IRegexFSM <char> char_fsm = char_dfa;
            var matchesArray          =
                ipAddressStrFragments
                .Select(ipAddressStrFragment => string.Join(string.Empty, ipAddressStrFragment))
                .Select(ipAddressStr =>
            {
                char_fsm.TransitMany(ipAddressStr);
                return(char_fsm.Matches);
            })
                .ToArray();
            ;
#else
            IRegexFSM <string> string_fsm = string_dfa;
            var matchesArray =
                ipAddressStrFragments
                .Select(ipAddressStr =>
            {
                string_fsm.TransitMany(ipAddressStr);
                return(string_fsm.Matches);
            })
                .ToArray();
            ;
#endif
        }