static double ConditionHappened(HashSet<IOTPhenomemon> observedPhenomemons, IOTPhenomemonType type, int node,
     double starttime, double endtime, IOTPhenomemon p1, ComparePhenomemon comparer)
 {
     foreach (IOTPhenomemon p in observedPhenomemons)
     {
         if (p.nodeId == node && p.type == type
             && p.start >= starttime && p.end <= endtime
             && comparer(p1, p))
         {
             return p.likehood;
         }
     }
     return global.SmallValue;
 }
 static double ConditionHappened(HashSet<IOTPhenomemon> observedPhenomemons, IOTPhenomemonType type, int node,
     double starttime, double endtime, IOTPhenomemon p1, List<IOTPhenomemon> list, ComparePhenomemon comparer)
 {
     double likehood = global.SmallValue;
     foreach (IOTPhenomemon p in observedPhenomemons)
     {
         if (p.nodeId == node && p.type == type
             && p.start >= starttime && p.end <= endtime
             && comparer(p1, p))
         {
             list.Add(p);
             likehood = Math.Max(p.likehood, likehood);
         }
     }
     return likehood;
 }
 public static bool ComparePhenomemonBySimiliarTag(IOTPhenomemon p1, IOTPhenomemon p2)
 {
     if (p1.pkg == null || p1.pkg.Type != PacketType.COMMAND)
         return false;
     //使用PacketSeq判断两个数据包是否为同一个
     return (p1.pkg.Command.tag == p2.pkg.Dst);
 }
 public static double SimiliarCommand(IOTPhenomemon p, List<IOTPhenomemon> list)
 {
     double likehood = 0;
     foreach (IOTPhenomemon p1 in list)
     {
         likehood = Math.Max(likehood, 1 - global.SmallValue - Math.Abs(p1.pkg.SrcSenderSeq - p.pkg.SrcSenderSeq) / 100);
     }
     return likehood;
 }
 public static bool ComparePhenomemonByExactTag(IOTPhenomemon p1, IOTPhenomemon p2)
 {
     if (p1.pkg == null || p1.pkg.Type != PacketType.COMMAND)
         return false;
     //使用PacketSeq判断两个数据包是否为同一个
     return (p1.pkg.Command.tag == p2.pkg.Dst && p1.pkg.SrcSenderSeq == p2.pkg.SrcSenderSeq);
 }