/// <summary>
        /// 获得指定键中出现频率最高的键。
        /// </summary>
        /// <typeparam name="TKey">键类型。</typeparam>
        /// <param name="st">用于计算的符号表。</param>
        /// <param name="keys">所有的键。</param>
        /// <returns><paramref name="keys"/> 中出现频率最高的键。</returns>
        public static TKey MostFrequentlyKey <TKey>(IST <TKey, int> st, TKey[] keys)
        {
            foreach (var s in keys)
            {
                if (st.Contains(s))
                {
                    st.Put(s, st.Get(s) + 1);
                }
                else
                {
                    st.Put(s, 1);
                }
            }

            var max = keys[0];

            foreach (var s in st.Keys())
            {
                if (st.Get(s) > st.Get(max))
                {
                    max = s;
                }
            }

            return(max);
        }
Example #2
0
        public static void InvokeLog(this ISynchronizeInvoke si, Delegate method, object[] args)
        {
            int pid = Thread.CurrentThread.ManagedThreadId;

            List <string> IST = null;
            bool          listExists;

            lock (dicoLock)
                listExists = InvokeStackTraces.TryGetValue(32, out IST);

            if (listExists)
            {
                IST = new List <string>();

                lock (dicoLock)
                    InvokeStackTraces.Add(pid, IST);
            }
            IST.Add(Environment.StackTrace);

            var iar = si.BeginInvoke(method, args);

            si.EndInvoke(iar);

            lock (dicoLock)
            {
                InvokeStackTraces.Remove(InvokeStackTraces.Count - 1);
                if (InvokeStackTraces.Count == 0)
                {
                    InvokeStackTraces.Remove(pid);
                }
            }
        }
        /// <summary>
        /// 用指定的数据测试符号表,返回 <see cref="FrequencyCounter"/> 用去的时间。
        /// </summary>
        /// <param name="st">用于测试的空符号表。</param>
        /// <param name="keys">键数组。</param>
        /// <returns>计算一次最常出现单词的时间。(毫秒)</returns>
        public static long Time <TKey>(IST <TKey, int> st, TKey[] keys)
        {
            var sw = new Stopwatch();

            sw.Start();
            FrequencyCounter.MostFrequentlyKey(st, keys);
            sw.Stop();
            return(sw.ElapsedMilliseconds);
        }
Example #4
0
        private void Test(IST <string, int> st)
        {
            FrequencyCounter.MostFrequentlyWordAnalysis("tale.txt", 8, st, out var callIndex, out var timeRecord);
            var panel = new Form2
            {
                Text = st.GetType().Name
            };

            panel.Show();
            panel.Draw(callIndex, timeRecord);
        }
        /// <summary>
        /// 计算数组中不重复元素的数量。
        /// </summary>
        /// <typeparam name="TKey">数组元素的类型。</typeparam>
        /// <param name="keys">包含重复元素的数组。</param>
        /// <param name="st">用于计算的符号表。</param>
        /// <returns><paramref name="keys"/> 中的不重复元素数量。</returns>
        public static int CountDistinct <TKey>(TKey[] keys, IST <TKey, int> st)
        {
            var distinct = 0;

            for (var i = 0; i < keys.Length; i++)
            {
                if (!st.Contains(keys[i]))
                {
                    st.Put(keys[i], ++distinct);
                }
            }
            return(distinct);
        }
        /// <summary>
        /// 获得指定文本文档中出现频率最高的所有字符串。
        /// </summary>
        /// <param name="filename">文件名。</param>
        /// <param name="minLength">字符串最小长度。</param>
        /// <param name="st">用于计算的符号表。</param>
        /// <returns>文本文档出现频率最高的字符串数组。</returns>
        public static string[] MostFrequentlyWords(string filename, int minLength, IST <string, int> st)
        {
            int distinct = 0, words = 0;
            var sr = new StreamReader(File.OpenRead(filename));

            var inputs =
                sr
                .ReadToEnd()
                .Split(new char[] { ' ', '\r', '\n' },
                       StringSplitOptions.RemoveEmptyEntries);

            foreach (var s in inputs)
            {
                if (s.Length < minLength)
                {
                    continue;
                }
                words++;
                if (st.Contains(s))
                {
                    st.Put(s, st.Get(s) + 1);
                }
                else
                {
                    st.Put(s, 1);
                    distinct++;
                }
            }

            var max   = "";
            var queue = new Queue <string>();

            st.Put(max, 0);
            foreach (var s in st.Keys())
            {
                if (st.Get(s) > st.Get(max))
                {
                    max = s;
                    queue.Clear();
                    queue.Enqueue(s);
                }
                else if (st.Get(s) == st.Get(max))
                {
                    queue.Enqueue(s);
                }
            }

            return(queue.ToArray());
        }
        /// <summary>
        /// 获得指定文本文档中出现频率最高的字符串。
        /// </summary>
        /// <param name="filename">文件名。</param>
        /// <param name="minLength">字符串最小长度。</param>
        /// <param name="st">用于计算的符号表。</param>
        /// <returns>文本文档出现频率最高的字符串。</returns>
        public static string MostFrequentlyWord(string filename, int minLength, IST <string, int> st)
        {
            int distinct = 0, words = 0;
            var sr = new StreamReader(File.OpenRead(filename));

            var inputs =
                sr
                .ReadToEnd()
                .Split(new char[] { ' ', '\r', '\n' },
                       StringSplitOptions.RemoveEmptyEntries);

            var lastPut = "";

            foreach (var s in inputs)
            {
                if (s.Length < minLength)
                {
                    continue;
                }
                words++;
                if (st.Contains(s))
                {
                    lastPut = s;
                    st.Put(s, st.Get(s) + 1);
                }
                else
                {
                    lastPut = s;
                    st.Put(s, 1);
                    distinct++;
                }
            }

            Console.WriteLine("Last Put: " + lastPut + "\t words count: " + words);

            var max = "";

            st.Put(max, 0);
            foreach (var s in st.Keys())
            {
                if (st.Get(s) > st.Get(max))
                {
                    max = s;
                }
            }

            return(max);
        }
        /// <summary>
        /// 对符号表进行性能测试,先 <see cref="IST{TKey, TValue}.Put(TKey, TValue)"/> <paramref name="n"/> 个字符串,
        /// 再进行若干次 <see cref="IST{TKey, TValue}.Get(TKey)"/>,
        /// 使得每个元素被平均访问 <paramref name="averageHit"/> 次,
        /// 以及同样多的未命中访问。
        /// </summary>
        /// <param name="st">需要进行性能测试的符号表。</param>
        /// <param name="n">需要插入符号表中的字符串数量。</param>
        /// <param name="averageHit">平均每个元素被查询的次数。</param>
        /// <returns>测试耗时,单位为毫秒。</returns>
        public static long Performance(IST <string, int> st, int n, int averageHit)
        {
            var keys        = GetRandomArrayString(n, 2, 50);
            var keyNotExist = GetRandomString(51, 52);
            var sw          = Stopwatch.StartNew();

            // 构建
            for (var i = 0; i < n; i++)
            {
                st.Put(keys[i], i);
            }
            // 查询
            for (var i = 0; i < averageHit; i++)
            {
                for (var j = 0; j < n; j++)
                {
                    st.Get(keys[j]);
                    st.Get(keyNotExist);
                }
            }
            sw.Stop();
            return(sw.ElapsedMilliseconds);
        }
        static void Test(int n, IST <int, int> st)
        {
            var data = new int[n];

            for (var i = 0; i < n; i++)
            {
                data[i] = i;
            }

            Shuffle(data);
            var sw = Stopwatch.StartNew();

            foreach (var item in data)
            {
                st.Put(item, item);
            }
            sw.Stop();
            Console.WriteLine("Random Put " + n + ":" + sw.ElapsedMilliseconds + "ms");

            Shuffle(data);
            sw.Restart();
            foreach (var item in data)
            {
                st.Get(item);
            }
            sw.Stop();
            Console.WriteLine("Random Get " + n + ":" + sw.ElapsedMilliseconds + "ms");

            Shuffle(data);
            sw.Restart();
            foreach (var item in data)
            {
                st.Delete(item);
            }
            sw.Stop();
            Console.WriteLine("Random Delete " + n + ":" + sw.ElapsedMilliseconds + "ms");
        }
        /// <summary>
        /// 计算指定文本文档中出现频率最高的字符串,
        /// 保存 <see cref="IST{TKey, TValue}.Get(TKey)"/>
        /// 和 <see cref="IST{TKey, TValue}.Put(TKey, TValue)"/>
        /// 的调用次数以及对应的耗时。
        /// </summary>
        /// <param name="filename">文件名。</param>
        /// <param name="minLength">字符串最小长度。</param>
        /// <param name="st">用于计算的符号表。</param>
        /// <param name="callIndex">调用次数。</param>
        /// <param name="timeRecord">对应耗时。</param>
        public static void MostFrequentlyWordAnalysis(string filename, int minLength, IST <string, int> st, out int[] callIndex, out long[] timeRecord)
        {
            var call = new List <int>();
            var time = new List <long>();
            var sw   = Stopwatch.StartNew();

            var callTime = 0;
            int distinct = 0, words = 0;
            var sr = new StreamReader(File.OpenRead(filename));

            var inputs =
                sr
                .ReadToEnd()
                .Split(new char[] { ' ', '\r', '\n' },
                       StringSplitOptions.RemoveEmptyEntries);

            for (var i = 0; i < inputs.Length; i++)
            {
                if (inputs[i].Length < minLength)
                {
                    continue;
                }
                words++;
                if (st.Contains(inputs[i]))
                {
                    st.Put(inputs[i], st.Get(inputs[i]) + 1);
                    callTime += 2;
                    time.Add(sw.ElapsedMilliseconds);
                    call.Add(callTime);
                }
                else
                {
                    st.Put(inputs[i], 1);
                    callTime++;
                    time.Add(sw.ElapsedMilliseconds);
                    call.Add(callTime);
                    distinct++;
                }
            }

            var max = "";

            st.Put(max, 0);
            callTime++;
            time.Add(sw.ElapsedMilliseconds);
            call.Add(callTime);
            foreach (var s in st.Keys())
            {
                if (st.Get(s) > st.Get(max))
                {
                    max = s;
                }
                callTime += 2;
                time.Add(sw.ElapsedMilliseconds);
                call.Add(callTime);
            }

            callIndex  = call.ToArray();
            timeRecord = time.ToArray();
        }
        /// <summary>
        /// 获得指定文本文档中出现频率最高的字符串。
        /// </summary>
        /// <param name="filename">文件名。</param>
        /// <param name="counts">从文件读入的单词数目。</param>
        /// <param name="minLength">字符串最小长度。</param>
        /// <param name="st">用于计算的符号表。</param>
        /// <returns>文本文档出现频率最高的字符串。</returns>
        public static string MostFrequentlyWord(string filename, int counts, int minLength, IST <string, int> st)
        {
            int distinct = 0, words = 0;
            var sr = new StreamReader(File.OpenRead(filename));

            var inputs =
                sr
                .ReadToEnd()
                .Split(new char[] { ' ', '\r', '\n' },
                       StringSplitOptions.RemoveEmptyEntries);

            for (var i = 0; i < counts && i < inputs.Length; i++)
            {
                if (inputs[i].Length < minLength)
                {
                    counts++;
                    continue;
                }
                words++;
                if (st.Contains(inputs[i]))
                {
                    st.Put(inputs[i], st.Get(inputs[i]) + 1);
                }
                else
                {
                    st.Put(inputs[i], 1);
                    distinct++;
                }
            }

            var max = "";

            st.Put(max, 0);
            foreach (var s in st.Keys())
            {
                if (st.Get(s) > st.Get(max))
                {
                    max = s;
                }
            }

            return(max);
        }
        public void GenerateSocialHistoryEntry(string observerValue, ref int refId, string obsrvType, III hl7III, Factory hl7Factory)
        {
            if (obsrvType == "Smoking")
            {
                IEntry entry = functionalStatus.Section.Entry.Append();
                //GetSNOMED(obsrvType)
                entry.AsObservation.ClassCode = "OBS";
                entry.AsObservation.MoodCode  = x_ActMoodDocumentObservation.EVN;
                IIVXB_TS TS = hl7Factory.CreateIVXB_TS();
                hl7III = entry.AsObservation.Id.Append();
                hl7III.Init(Guid.NewGuid().ToString());
                hl7III = entry.AsObservation.TemplateId.Append();
                hl7III.Init("2.16.840.1.113883.10.20.22.4.78");
                //entry.AsObservation.Code.Code = IIf(obsrvType = "Smoking", "230056004", IIf(obsrvType = "Alcohol", "160573003", IIf(obsrvType = "Drugs", "228423003", "229819007")))
                IED ED = hl7Factory.CreateED();
                entry.AsObservation.Code.Code           = "ASSERTION";
                entry.AsObservation.Code.DisplayName    = "Assertion";
                entry.AsObservation.Code.CodeSystem     = "2.16.840.1.113883.5.4";
                entry.AsObservation.Code.CodeSystemName = "ActCode";
                //ED.Reference.Value = "#Sec" + refId
                //entry.AsObservation.Code.OriginalText = ED
                //entry.AsObservation.Code.CodeSystem = "2.16.840.1.113883.6.96"
                //entry.AsObservation.Code.DisplayName = IIf(obsrvType = "Smoking", "Cigarette smoking", IIf(obsrvType = "Alcohol", "Alcohol consumption", IIf(obsrvType = "Drugs", "Drugs consumption", "Tobacoo consumption")))

                entry.AsObservation.StatusCode.Init("completed");
                entry.AsObservation.EffectiveTime = new IVL_TS().Init(low: new IVXB_TS(), high: new IVXB_TS());
                //entry.AsObservation.EffectiveTime.High.Value = "UNK"
                ICD CD = hl7Factory.CreateCD();
                CD.CodeSystemName = "SNOMED CT";
                //= observerValue
                CD.CodeSystem  = "2.16.840.1.113883.6.96";
                CD.Code        = "77176002";
                CD.DisplayName = "Cigarette smoking";
                CD.OriginalText.Reference.Value = "#Sec" + refId;
                entry.AsObservation.Value.Add(CD);
                refId = refId + 1;
            }
            else
            {
                IEntry entry = functionalStatus.Section.Entry.Append();
                GetSNOMED(obsrvType);
                entry.TypeCode = x_ActRelationshipEntry.DRIV;
                entry.AsObservation.ClassCode = "OBS";
                entry.AsObservation.MoodCode  = x_ActMoodDocumentObservation.EVN;
                IIVXB_TS TS = hl7Factory.CreateIVXB_TS();
                hl7III = entry.AsObservation.Id.Append();
                hl7III.Init(Guid.NewGuid().ToString());
                hl7III = entry.AsObservation.TemplateId.Append();
                hl7III.Init("2.16.840.1.113883.10.20.22.4.38");
                entry.AsObservation.Code.Code = (obsrvType == "Smoking" ? "230056004" : (obsrvType == "Alcohol" ? "160573003" : (obsrvType == "Drugs" ? "228423003" : "229819007")));
                IED ED = hl7Factory.CreateED();
                ED.Reference.Value = "#Sec" + refId;
                entry.AsObservation.Code.OriginalText = ED;
                entry.AsObservation.Code.CodeSystem   = "2.16.840.1.113883.6.96";
                entry.AsObservation.Code.DisplayName  = (obsrvType == "Smoking" ? "Cigarette smoking" : (obsrvType == "Alcohol" ? "Alcohol consumption" : (obsrvType == "Drugs" ? "Drugs consumption" : "Tobacoo consumption")));

                entry.AsObservation.StatusCode.Init("completed");
                entry.AsObservation.EffectiveTime.NullFlavor = "UNK";
                IST ST = hl7Factory.CreateST();
                ST.Text = observerValue;
                entry.AsObservation.Value.Add(ST);
                refId = refId + 1;
            }
        }
Example #13
0
 public static string ToUri(this IST st)
 {
     return(EntityEx.ToUri(st));
 }
        public OperationCardModel Execute(string heatNumber)
        {
            try
            {
                if (string.IsNullOrEmpty(heatNumber))
                {
                    return(null);
                }

                using (var dbSession = dbFacade.Transaction())
                {
                    var order = dbSession.Set <ProductionOrder>()
                                .Include(x => x.Grade)
                                .Include(x => x.MotherHeat)
                                .Include(x => x.Plant)
                                .Include(x => x.ElectrodeFormat)
                                .Where(x => x.HeatNumber == heatNumber)
                                .SingleOrDefault();

                    if (order == null)
                    {
                        return(null);
                    }

                    var electrode = dbSession.Set <Electrode>()
                                    .Where(x => x.Name == heatNumber)
                                    .SingleOrDefault();

                    if (electrode == null)
                    {
                        return(null);
                    }

                    var operationCard = dbSession.Set <OperationCard>()
                                        .Where(x => x.HeatNumber == heatNumber)
                                        .SingleOrDefault();

                    var blockSurfaces = dbSession.Set <CrossSection>().Where(c => c.Type == "BlockSurface").ToList();
                    var Substances    = new SubstanceWrapper()
                    {
                        SubstanceList = new List <OperationCardModel.Substance>()
                    };
                    var ISTs      = new List <IST>();
                    var Grindings = new List <Grinding>();
                    var Blocks    = new List <Block>();

                    if (operationCard != null)
                    {
                        // Signatures
                        var loggedData = dbSession.Set <OperationCardLogs>()
                                         .Include(x => x.Operator)
                                         .Where(x => x.OperationCardID == operationCard.ID);

                        foreach (var item in loggedData)
                        {
                            switch (item.Type)
                            {
                            case "Substances":
                                Substances.LogPKID  = item.ID;
                                Substances.Date     = item.Date;
                                Substances.Operator = item.Operator;
                                break;

                            case "IST":
                                var ist = new IST()
                                {
                                    LogPKID  = item.ID,
                                    Ist      = item.Content,
                                    Date     = item.Date,
                                    Operator = item.Operator
                                };
                                ISTs.Add(ist);
                                break;

                            case "Grinding":
                                var grinding = new Grinding()
                                {
                                    LogPKID      = item.ID,
                                    GrindingTime = int.Parse(item.Content),
                                    Error        = item.Error,
                                    Date         = item.Date,
                                    Operator     = item.Operator
                                };
                                Grindings.Add(grinding);
                                break;

                            case "Block":
                                var block = new Block()
                                {
                                    LogPKID  = item.ID,
                                    Weight   = item.Content,
                                    Date     = item.Date,
                                    Operator = item.Operator
                                };
                                Blocks.Add(block);
                                break;

                            default:
                                throw Oops.Rewrap(new EntryPointNotFoundException($"The signed row of item Type {item.Type} does not have processing implemented."));
                            }
                        }
                    }

                    return(new OperationCardModel()
                    {
                        HeatNumber = heatNumber,
                        Customer = order.Customer,
                        Quantity1 = "Missing from ERP", // Missing from ERP
                        BGHNumber = order.Grade.Name,
                        ScrapGroup = order.ScrapGroup,
                        StorageMold = false, // Missing from ERP
                        ElectrodeFormat = order.ElectrodeFormat.Name,
                        ElectrodeLength = electrode.Length,
                        Surface = "Missing from ERP", // Missing from ERP
                        Quantity2 = 0,                // Missing from ERP
                        BilletNumber = electrode.BilletNumber,
                        SandBlasting = order.Grade.SandBlasting,
                        SlagNumber = operationCard?.SlagNumber,
                        AGGNumber = order.Plant.AGGNumber,

                        BlockSurfaces = blockSurfaces,
                        BlockSurface = operationCard?.BlockSurfaceID != null?blockSurfaces.FirstOrDefault(c => c.ID == operationCard.BlockSurfaceID) : null,

                                           ErrorCode = operationCard?.ErrorCode,
                                           Photo = operationCard?.Photo,
                                           Glow = operationCard?.Glow,
                                           UserID = operationCard != null ? operationCard.UserID : -1,

                                           Substances = Substances,
                                           ISTs = ISTs,
                                           Grindings = Grindings,
                                           Blocks = Blocks,
                    });
                }
            }
            catch (Exception e)
            { throw Oops.Rewrap(e); }
        }