Пример #1
0
        public static void toARFF(string aDataDirectory, string masterDirectory, int maxControllers, string sourceFile, int annotators,string[] filter)
        {
            int featureVectorIndex = 0;
            MITesDecoder aMITesDecoder = new MITesDecoder();
            MITesLoggerReader aMITesLoggerReader = new MITesLoggerReader(aMITesDecoder, aDataDirectory);           
            SXML.SensorAnnotation sannotation = null;
            MITesFeatures.core.conf.GeneralConfiguration configuration = null;

            AXML.Annotation[] aannotation = new AXML.Annotation[annotators];
            AXML.Reader[] readers=new AXML.Reader[annotators];
            AXML.Annotation intersection = null;
            AXML.Annotation[] difference = new AXML.Annotation[annotators];
            AXML.Annotation realtimeAnnotation = new AXML.Reader(masterDirectory, aDataDirectory).parse();
            realtimeAnnotation.RemoveData(filter);



            for (int i = 0; (i < annotators); i++)
            {
                readers[i] = new AXML.Reader(masterDirectory, aDataDirectory, sourceFile + i + ".xml");
                aannotation[i] = readers[i].parse();
                aannotation[i].RemoveData(filter);
                aannotation[i].DataDirectory = aDataDirectory;
                if (intersection == null)
                    intersection = aannotation[i];
                else
                    intersection = intersection.Intersect(aannotation[i]);
            }

    
            for (int i = 0; (i < annotators); i++)            
                difference[i] = aannotation[i].Difference(intersection);

            


            SXML.Reader sreader = new SXML.Reader(masterDirectory, aDataDirectory);           
            sannotation = sreader.parse(maxControllers);

            MITesFeatures.core.conf.ConfigurationReader creader = new MITesFeatures.core.conf.ConfigurationReader(aDataDirectory);
            configuration = creader.parse();
  
            Extractor.Initialize(aMITesDecoder, aDataDirectory, aannotation[0], sannotation,configuration);
            

            TextWriter tw = new StreamWriter(aDataDirectory + "\\output-"+sourceFile+".arff");
            tw.WriteLine("@RELATION wockets");
            tw.WriteLine(Extractor.GetArffHeader());


            tw.WriteLine("@ATTRIBUTE INDEX NUMERIC");
            tw.WriteLine("@ATTRIBUTE ANNOTATORS_AGREE NUMERIC");
            
            Hashtable recorded_activities = new Hashtable();
            for (int k = 0; (k < annotators); k++)
            {
                //tw.Write("@ATTRIBUTE annotator"+k+" {unknown");
                //tw.Write("@ATTRIBUTE annotator" + k + " {");
                
                for (int i = 0; (i < aannotation[k].Data.Count); i++)
                {
                    AXML.AnnotatedRecord record = ((AXML.AnnotatedRecord)aannotation[k].Data[i]);
                    string activity = "";
                    for (int j = 0; (j < record.Labels.Count); j++)
                    {
                        if (j == record.Labels.Count - 1)
                            activity += ((AXML.Label)record.Labels[j]).Name;
                        else
                            activity += ((AXML.Label)record.Labels[j]).Name + "_";
                    }
                    activity = activity.Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                    activity = Regex.Replace(activity, "[_]+", "_");
                    activity = Regex.Replace(activity, "^[_]+", "");
                    activity = Regex.Replace(activity, "[_]+$", "");
                    //only output activity labels that have not been seen
                    if (recorded_activities.Contains(activity) == false)
                    {
                        //tw.Write("," + activity);
                        recorded_activities[activity] = activity;
                    }
                }
                
            }


            for (int k = 0; (k < annotators); k++)
            {
                tw.Write("@ATTRIBUTE annotator" + k + " {unknown,flapping,rocking,flaprock}\n");
                //foreach ( DictionaryEntry de in recorded_activities )
                 //   tw.Write("," + (string) de.Key); 
                //tw.WriteLine("}");
            }

            tw.Write("@ATTRIBUTE realtime {unknown,flapping,rocking,flaprock}\n");
            //foreach (DictionaryEntry de in recorded_activities)
             //   tw.Write("," + (string)de.Key);
            //tw.WriteLine("}");

            tw.WriteLine("@DATA");

            bool isData = aMITesLoggerReader.GetSensorData(10);
            int channel = 0, x = 0, y = 0, z = 0;
            double unixtimestamp = 0.0;

            int[] differenceIndex = new int[annotators];
            AXML.AnnotatedRecord[] annotatedRecord = new AXML.AnnotatedRecord[annotators];
            int intersectionIndex = 0;
            string intersection_activity = "unknown";
            AXML.AnnotatedRecord intersectionRecord = ((AXML.AnnotatedRecord)intersection.Data[intersectionIndex]);
            string[] current_activity = new string[annotators];
            string realtime_activity = "unknown";
            int realtimeIndex = 0;
            AXML.AnnotatedRecord realtimeRecord = ((AXML.AnnotatedRecord)realtimeAnnotation.Data[realtimeIndex]);
            for (int i = 0; (i < annotators); i++)
            {
                differenceIndex[i] = 0;
                annotatedRecord[i] = ((AXML.AnnotatedRecord)difference[i].Data[differenceIndex[i]]);
                current_activity[i] = "unknown";
            }
                
                
            do
            {
                //decode the frame
                channel = aMITesDecoder.GetSomeMITesData()[0].channel;
                x = aMITesDecoder.GetSomeMITesData()[0].x;
                y = aMITesDecoder.GetSomeMITesData()[0].y;
                z = aMITesDecoder.GetSomeMITesData()[0].z;
                unixtimestamp = aMITesDecoder.GetSomeMITesData()[0].unixTimeStamp;
                double lastTimeStamp = Extractor.StoreMITesWindow();

                for (int i = 0; (i < annotators); i++)
                {
                    if (unixtimestamp > annotatedRecord[i].EndUnix)
                    {
                        current_activity[i] = "unknown";
                        if (differenceIndex[i] < difference[i].Data.Count - 1)
                        {
                            differenceIndex[i] = differenceIndex[i]+1;
                            annotatedRecord[i] = ((AXML.AnnotatedRecord)difference[i].Data[differenceIndex[i]]);
                        }
                    }
                }


                if (unixtimestamp > realtimeRecord.EndUnix)
                {
                    realtime_activity = "unknown";
                    realtimeIndex++;
                    if (realtimeIndex < realtimeAnnotation.Data.Count)                                            
                        realtimeRecord = ((AXML.AnnotatedRecord)realtimeAnnotation.Data[realtimeIndex]);                    
                }


                if (unixtimestamp > intersectionRecord.EndUnix)
                {
               
                    intersection_activity = "unknown";
                    if (intersectionIndex < intersection.Data.Count - 1)
                    {
                        intersectionIndex = intersectionIndex + 1;
                        intersectionRecord = ((AXML.AnnotatedRecord)intersection.Data[intersectionIndex]);
                    }
                }

                for (int i = 0; (i < annotators); i++)
                {
                    if ((lastTimeStamp >= annotatedRecord[i].StartUnix) &&
                         (lastTimeStamp <= annotatedRecord[i].EndUnix) && current_activity[i].Equals("unknown"))
                    {
                        current_activity[i] = "";
                        for (int j = 0; (j < annotatedRecord[i].Labels.Count); j++)
                        {
                            if (j == annotatedRecord[i].Labels.Count - 1)
                                current_activity[i] += ((AXML.Label)annotatedRecord[i].Labels[j]).Name;
                            else
                                current_activity[i] += ((AXML.Label)annotatedRecord[i].Labels[j]).Name + "_";
                        }
                        current_activity[i] = current_activity[i].Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                        current_activity[i] = Regex.Replace(current_activity[i], "[_]+", "_");
                        current_activity[i] = Regex.Replace(current_activity[i], "^[_]+", "");
                        current_activity[i] = Regex.Replace(current_activity[i], "[_]+$", "");
                    }
                    else if (lastTimeStamp > annotatedRecord[i].EndUnix)
                        current_activity[i] = "unknown";
                 
                }

                if ((lastTimeStamp >= realtimeRecord.StartUnix) &&
                       (lastTimeStamp <= realtimeRecord.EndUnix) && realtime_activity.Equals("unknown"))
                {
                    realtime_activity = "";
                    for (int j = 0; (j < realtimeRecord.Labels.Count); j++)
                    {
                        if (j == realtimeRecord.Labels.Count - 1)
                            realtime_activity += ((AXML.Label)realtimeRecord.Labels[j]).Name;
                        else
                            realtime_activity += ((AXML.Label)realtimeRecord.Labels[j]).Name + "_";
                    }
                    realtime_activity = realtime_activity.Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                    realtime_activity = Regex.Replace(realtime_activity, "[_]+", "_");
                    realtime_activity = Regex.Replace(realtime_activity, "^[_]+", "");
                    realtime_activity = Regex.Replace(realtime_activity, "[_]+$", "");
                }
                else if (lastTimeStamp > realtimeRecord.EndUnix)
                    realtime_activity = "unknown";



                if ((lastTimeStamp >= intersectionRecord.StartUnix) &&
                     (lastTimeStamp <= intersectionRecord.EndUnix) && intersection_activity.Equals("unknown"))
                {
                    intersection_activity = "";
                    for (int j = 0; (j < intersectionRecord.Labels.Count); j++)
                    {
                        if (j == intersectionRecord.Labels.Count - 1)
                            intersection_activity += ((AXML.Label)intersectionRecord.Labels[j]).Name;
                        else
                            intersection_activity += ((AXML.Label)intersectionRecord.Labels[j]).Name + "_";
                    }
                    intersection_activity = intersection_activity.Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                    intersection_activity = Regex.Replace(intersection_activity, "[_]+", "_");
                    intersection_activity = Regex.Replace(intersection_activity, "^[_]+", "");
                    intersection_activity = Regex.Replace(intersection_activity, "[_]+$", "");
                }
              


                if ((Extractor.GenerateFeatureVector(lastTimeStamp)))
                {

                    string activity_suffix = "," + featureVectorIndex;
                

                    if (intersection_activity.Equals("unknown") == true) //disagreement or agreement unknown
                    {
                        

                        if ((current_activity[0] == "unknown") && (current_activity[1] == "unknown"))
                            activity_suffix += ",1";
                        else
                            activity_suffix += ",0";
                        for (int i = 0; (i < annotators); i++)
                            activity_suffix += "," + current_activity[i];
                    }
                    else
                    {
                        activity_suffix += ",1";
                        for (int i = 0; (i < annotators); i++)
                            activity_suffix += "," + intersection_activity;
                    }
                    
                    string arffSample = Extractor.toString() + activity_suffix;
                    //if (activity_suffix.Contains("unknown") == false)
                    //{
                        tw.WriteLine(arffSample+","+realtime_activity);
                        featureVectorIndex++;
                    //}
                  

                }
               

            } while (isData = aMITesLoggerReader.GetSensorData(10));

            tw.Close();
        }
Пример #2
0
        public static void toARFF(string aDataDirectory, string masterDirectory, int maxControllers, string[] filter)
        {
            MITesDecoder aMITesDecoder = new MITesDecoder();
            MITesLoggerReader aMITesLoggerReader = new MITesLoggerReader(aMITesDecoder, aDataDirectory);
            AXML.Annotation aannotation=null;
            SXML.SensorAnnotation sannotation=null;
            GeneralConfiguration configuration = new ConfigurationReader(aDataDirectory).parse();
            AXML.Reader reader = new AXML.Reader(masterDirectory, aDataDirectory);
           // if (reader.validate() == false)            
            //    throw new Exception("Error Code 0: XML format error - activities.xml does not match activities.xsd!");            
            //else
           // {
                aannotation = reader.parse();
                aannotation.RemoveData(filter);
                aannotation.DataDirectory = aDataDirectory;

                SXML.Reader sreader = new SXML.Reader(masterDirectory, aDataDirectory);
              //  if (sreader.validate() == false)               
              //      throw new Exception("Error Code 0: XML format error - sensors.xml does not match sensors.xsd!");               
               // else                
                    sannotation = sreader.parse(maxControllers);
                
            //}

            Extractor.Initialize(aMITesDecoder, aDataDirectory, aannotation, sannotation,configuration);

     
            TextWriter tw = new StreamWriter(aDataDirectory + "\\realtime-output.arff");            
            tw.WriteLine("@RELATION wockets");
            tw.WriteLine(Extractor.GetArffHeader());
            tw.Write("@ATTRIBUTE activity {unknown");
            Hashtable recorded_activities = new Hashtable();
            for (int i=0;(i<aannotation.Data.Count);i++)
            {
                AXML.AnnotatedRecord record = ((AXML.AnnotatedRecord)aannotation.Data[i]);
                string activity="";
                for (int j = 0; (j <record.Labels.Count); j++)
                {
                    if (j==record.Labels.Count-1)
                        activity+=((AXML.Label)record.Labels[j]).Name;
                    else
                        activity += ((AXML.Label)record.Labels[j]).Name+"_";
                }
                activity = activity.Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                activity = Regex.Replace(activity, "[_]+", "_");
                activity = Regex.Replace(activity, "^[_]+", "");
                activity = Regex.Replace(activity, "[_]+$", "");
                //only output activity labels that have not been seen
                if (recorded_activities.Contains(activity) == false)
                {
                    tw.Write("," + activity);
                    recorded_activities[activity] = activity;
                }
            }
            tw.WriteLine("}");
            tw.WriteLine("@DATA");

            bool isData = aMITesLoggerReader.GetSensorData(10);               
            int channel = 0, x = 0, y = 0, z = 0;
            double unixtimestamp = 0.0;
            int activityIndex = 0;
            AXML.AnnotatedRecord annotatedRecord=((AXML.AnnotatedRecord)aannotation.Data[activityIndex]);
            string current_activity = "unknown";
            TextWriter tww = new StreamWriter("test.csv");
            do
            {                
                //decode the frame
                channel = aMITesDecoder.GetSomeMITesData()[0].channel;
                x = aMITesDecoder.GetSomeMITesData()[0].x;
                y = aMITesDecoder.GetSomeMITesData()[0].y;
                z = aMITesDecoder.GetSomeMITesData()[0].z;
                unixtimestamp = aMITesDecoder.GetSomeMITesData()[0].unixTimeStamp;
                tww.WriteLine(unixtimestamp + "," + x + "," + y + "," + z);
                double lastTimeStamp = Extractor.StoreMITesWindow();
                //DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                //dt=dt.AddMilliseconds(unixtimestamp);
                //DateTime dt2 = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                //dt2 = dt2.AddMilliseconds(annotatedRecord.EndUnix);
                if (unixtimestamp > annotatedRecord.EndUnix)
                {
                    current_activity = "unknown";
                    if (activityIndex < aannotation.Data.Count-1)
                    {
                        activityIndex++;
                        annotatedRecord = ((AXML.AnnotatedRecord)aannotation.Data[activityIndex]);
                    }
                }

                if ((lastTimeStamp >= annotatedRecord.StartUnix) &&
                     (lastTimeStamp <= annotatedRecord.EndUnix) && current_activity.Equals("unknown"))
                {
                    current_activity = "";
                    for (int j = 0; (j < annotatedRecord.Labels.Count); j++)
                    {
                        if (j == annotatedRecord.Labels.Count - 1)
                            current_activity += ((AXML.Label)annotatedRecord.Labels[j]).Name;
                        else
                            current_activity += ((AXML.Label)annotatedRecord.Labels[j]).Name + "_";
                    }
                    current_activity = current_activity.Replace("none", "").Replace('-', '_').Replace(':', '_').Replace('%', '_').Replace('/', '_');
                    current_activity = Regex.Replace(current_activity, "[_]+", "_");
                    current_activity = Regex.Replace(current_activity, "^[_]+", "");
                    current_activity = Regex.Replace(current_activity, "[_]+$", "");
                }
                
                //if (lastTimeStamp>=
                //if (current_activity.Equals("unknown") == false)
                //{
                    if ((Extractor.GenerateFeatureVector(lastTimeStamp)))
                    {
                        string arffSample = Extractor.toString() + "," + current_activity;
                        tw.WriteLine(arffSample);
                        
                    }
                //}

            } while (isData = aMITesLoggerReader.GetSensorData(10));

            tww.Close();
            tw.Close();
        }
Пример #3
0
        public static void Initialize2(MITesDecoder aMITesDecoder, string aDataDirectory,
            AXML.Annotation aannotation, SXML.SensorAnnotation sannotation,Hashtable calibrations)//, string masterDirectory)
        {

            Extractor.aannotation = aannotation;
            Extractor.sannotation = sannotation;
            Extractor.calibrations = calibrations;

            // count the sensors for feature extraction and identify their indicies in
            // sensor annotation - at the moment only accelerometers are used
            Extractor.sensorIndicies = new Hashtable();
            Extractor.extractorSensorCount = 0;
            foreach (SXML.Sensor sensor in sannotation.Sensors)
            {
                int channel = Convert.ToInt32(sensor.ID);
                if (channel > 0) // if accelerometer
                {
                    Extractor.sensorIndicies[channel] = extractorSensorCount;
                    Extractor.extractorSensorCount++;
                }
            }


            //load sensor data
            //SXML.Reader sreader = new SXML.Reader(masterDirectory, aDataDirectory);
            //Extractor.sannotation = sreader.parse();

            //load configuration
            ConfigurationReader creader = new ConfigurationReader(aDataDirectory);
            Extractor.dconfiguration = creader.parse();


            //load annotation data
            //AXML.Reader reader = new AXML.Reader(masterDirectory, aDataDirectory + "\\" + AXML.Reader.DEFAULT_XML_FILE);
            //Extractor.aannotation = reader.parse();          
            //CHANGE: gathers training samples based on the first category only 
            Extractor.trainingTime = new Hashtable();//int[((AXML.Category)Extractor.aannotation.Categories[0]).Labels.Count];
            //for (int i = 0; (i < Extractor.trainingTime.Length); i++)
            foreach (AXML.Label label in ((AXML.Category)Extractor.aannotation.Categories[0]).Labels)
                Extractor.trainingTime.Add(label.Name, 0);
            //Extractor.trainingTime[i] = 0;
            Extractor.trainingCompleted = false;

            Extractor.inputRowSize = Extractor.extractorSensorCount * 3;
            Extractor.fftInterpolationPower = dconfiguration.FFTInterpolatedPower;
            Extractor.fftMaximumFrequencies = dconfiguration.FFTMaximumFrequencies;
            //Extractor.trainingTimePerClass = configuration.TrainingTime;
            //Extractor.trainingWaitTime = configuration.TrainingWaitTime;         
            Extractor.inputColumnSize = (int)Math.Pow(2, Extractor.fftInterpolationPower);


            int MOTION_DIRECTIONS = 3;
            int ORIENTATIONS = 8;
            int meansIndex = 0;
            int varianceIndex = meansIndex + Extractor.extractorSensorCount + 1; // means 1 per sensors + add 1 for total mean
            int orientationIndex = varianceIndex + Extractor.extractorSensorCount + 1; //variances 1 per sensor + add 1 for total variance

            int closestOrientationIndex = orientationIndex + (Extractor.extractorSensorCount * ORIENTATIONS); // for 8 orientations, score each sensor to the orientations
            int orientationSensorsIndex = closestOrientationIndex + Extractor.extractorSensorCount; // 1 discrete orientation per sensor
            int sensorsCorrelationIndex = orientationSensorsIndex + (Extractor.extractorSensorCount - 1) * Extractor.extractorSensorCount; // n* n-1 relative orientations between sensors
            int sensorPercentMotionIndex = sensorsCorrelationIndex + ((Extractor.inputRowSize * Extractor.inputRowSize) - Extractor.inputRowSize) / 2; //number of correlation coefficients between axes
            int sensorMotionTypeIndex = sensorPercentMotionIndex + (Extractor.extractorSensorCount * MOTION_DIRECTIONS * 3);


            Extractor.num_features = Extractor.extractorSensorCount; // number of means
            Extractor.num_features += 1; //total mean;
            Extractor.num_features += Extractor.extractorSensorCount; // number of variances
            Extractor.num_features += 1; //total variance;
            
            Extractor.num_features += Extractor.extractorSensorCount * ORIENTATIONS; // number of orientation scores
            
            Extractor.num_features += Extractor.extractorSensorCount; // best orientation
            
            Extractor.num_features += (((Extractor.extractorSensorCount - 1) * Extractor.extractorSensorCount)/2); // n* n-1 relative orientations between sensors
            
            Extractor.num_features += ((Extractor.inputRowSize * Extractor.inputRowSize) - Extractor.inputRowSize) / 2; //correlation coefficients off-di
            Extractor.num_features += (Extractor.extractorSensorCount * MOTION_DIRECTIONS * 3); //percent of motion in each motion direction for the 3 axes
            Extractor.num_features += (Extractor.extractorSensorCount * MOTION_DIRECTIONS * 3); //Type of motion in each motion direction for the 3 axes




            Extractor.features = new double[Extractor.num_features];
            //Extractor.arffAttriburesLabels = new string[Extractor.num_features];
            //Extractor.attributeLocation = new Hashtable();

            Extractor.standardized = new double[inputRowSize][];
            for (int i = 0; (i < inputRowSize); i++)
                Extractor.standardized[i] = new double[Extractor.inputColumnSize];//input[0].Length];
            Extractor.means = new double[inputRowSize];
            Extractor.variances = new double[inputRowSize];

            //inputFFT = new int[Extractor.inputColumnSize];
            //FFT.Initialize(fftInterpolationPower, fftMaximumFrequencies);
            Extractor.aMITesDecoder = aMITesDecoder;

            //Create the ARFF File header
            string arffHeader = "@RELATION wockets\n\n" + Extractor.GetArffHeader2();//sannotation.Sensors.Count * 3, configuration.FFTMaximumFrequencies);
            arffHeader += "@ATTRIBUTE activity {";
            foreach (AXML.Label label in ((AXML.Category)Extractor.aannotation.Categories[0]).Labels)
                arffHeader += label.Name.Replace(' ', '_') + ",";
            arffHeader += "unknown}\n";
            arffHeader += "\n@DATA\n\n";

            //Calculating windowing parameters

            //total number of points per interpolated window
            Extractor.INTERPOLATED_SAMPLING_RATE_PER_WINDOW = (int)Math.Pow(2, dconfiguration.FFTInterpolatedPower); //128;  

            //space between interpolated samples
            Extractor.INTERPOLATED_SAMPLES_SPACING = (double)dconfiguration.WindowTime / INTERPOLATED_SAMPLING_RATE_PER_WINDOW;


            //expected sampling rate per MITes
            //Extractor.EXPECTED_SAMPLING_RATE = dconfiguration.ExpectedSamplingRate / sannotation.Sensors.Count; //samples per second
            //expected samples per window
            //Extractor.EXPECTED_WINDOW_SIZE = (int)(EXPECTED_SAMPLING_RATE * (dconfiguration.WindowTime / 1000.0)); // expectedSamplingRate per window
            //what would be considered a good sampling rate
            //Extractor.EXPECTED_GOOD_SAMPLING_RATE = EXPECTED_WINDOW_SIZE - (int)(dconfiguration.MaximumNonconsecutiveFrameLoss * EXPECTED_WINDOW_SIZE); //number of packets lost per second                      
            //space between samples
            //Extractor.EXPECTED_SAMPLES_SPACING = (double)dconfiguration.WindowTime / EXPECTED_WINDOW_SIZE;
            Extractor.EXPECTED_SAMPLING_RATES = new int[Extractor.extractorSensorCount];
            Extractor.EXPECTED_WINDOW_SIZES = new int[Extractor.extractorSensorCount];
            Extractor.EXPECTED_GOOD_SAMPLING_RATES = new int[Extractor.extractorSensorCount];
            Extractor.EXPECTED_SAMPLES_SPACING = new double[Extractor.extractorSensorCount];

            //foreach (SXML.Sensor sensor in sannotation.Sensors)
            foreach (DictionaryEntry sensorEntry in Extractor.sensorIndicies)
            {
                //Get the channel and index in data array for only
                // extractor sensors (sensors that will be used to compute
                // features i.e. accelerometers)
                int channel = (int)sensorEntry.Key;
                int sensorIndex = (int)sensorEntry.Value;
                SXML.Sensor sensor = ((SXML.Sensor)sannotation.Sensors[(int)sannotation.SensorsIndex[channel]]);
                int receiverID = Convert.ToInt32(sensor.Receiver);

                Extractor.EXPECTED_SAMPLING_RATES[sensorIndex] = dconfiguration.ExpectedSamplingRate / sannotation.NumberSensors[receiverID];
                Extractor.EXPECTED_WINDOW_SIZES[sensorIndex] = (int)(Extractor.EXPECTED_SAMPLING_RATES[sensorIndex] * (dconfiguration.WindowTime / 1000.0));
                Extractor.EXPECTED_GOOD_SAMPLING_RATES[sensorIndex] = Extractor.EXPECTED_WINDOW_SIZES[sensorIndex] - (int)(dconfiguration.MaximumNonconsecutiveFrameLoss * Extractor.EXPECTED_WINDOW_SIZES[sensorIndex]);
                Extractor.EXPECTED_SAMPLES_SPACING[sensorIndex] = (double)dconfiguration.WindowTime / Extractor.EXPECTED_WINDOW_SIZES[sensorIndex];
            }



            //window counters and delimiters
            Extractor.next_window_end = 0;
            Extractor.total_window_count = 0;
            Extractor.num_feature_windows = 0;

            //data quality variables
            Extractor.isAcceptableLossRate = true;
            Extractor.isAcceptableConsecutiveLoss = true;
            Extractor.unacceptable_window_count = 0;
            Extractor.unacceptable_consecutive_window_loss_count = 0;


            //2 D array that stores Sensor axes + time stamps on each row  X expected WINDOW SIZE
            Extractor.data = new double[Extractor.extractorSensorCount * 4][]; // 1 row for each axis

            // 2D array that stores Sensor axes X INTERPOLATED WINDOW SIZE
            Extractor.interpolated_data = new double[Extractor.extractorSensorCount * 3][];

            // array to store the y location for each axes as data is received
            // will be different for every sensor of course
            Extractor.y_index = new int[Extractor.extractorSensorCount];


            //Initialize expected data array

            foreach (DictionaryEntry sensorEntry in Extractor.sensorIndicies)
            {
                //Get the channel and index in data array for only
                // extractor sensors (sensors that will be used to compute
                // features i.e. accelerometers)
                int channel = (int)sensorEntry.Key;
                int sensorIndex = (int)sensorEntry.Value;
                int adjusted_sensor_index = sensorIndex * 4;

                //Initialize 4 rows x,y,z timestamp
                for (int j = 0; j < 4; j++)
                {
                    Extractor.data[adjusted_sensor_index] = new double[EXPECTED_WINDOW_SIZES[sensorIndex]];
                    for (int k = 0; (k < EXPECTED_WINDOW_SIZES[sensorIndex]); k++)
                        Extractor.data[adjusted_sensor_index][k] = 0;
                    adjusted_sensor_index++;
                }

            }


            //Here it is equal across all sensors, so we do not need to consider
            //the sampling rate of each sensor separately
            for (int j = 0; (j < (Extractor.extractorSensorCount * 3)); j++)
            {
                Extractor.interpolated_data[j] = new double[INTERPOLATED_SAMPLING_RATE_PER_WINDOW];
                for (int k = 0; (k < INTERPOLATED_SAMPLING_RATE_PER_WINDOW); k++)
                    Extractor.interpolated_data[j][k] = 0;
            }

            //Initialize y index for each sensor
            for (int j = 0; (j < Extractor.extractorSensorCount); j++)
                Extractor.y_index[j] = 0;


        }
Пример #4
0
        public static void Initialize(MITesDecoder aMITesDecoder, string aDataDirectory,
            AXML.Annotation aannotation,SXML.SensorAnnotation sannotation)//, string masterDirectory)
        {

            Extractor.aannotation = aannotation;
            Extractor.sannotation = sannotation;

            //load sensor data
            //SXML.Reader sreader = new SXML.Reader(masterDirectory, aDataDirectory);
            //Extractor.sannotation = sreader.parse();

            //load configuration
            ConfigurationReader creader = new ConfigurationReader(aDataDirectory);
            Extractor.dconfiguration = creader.parse();

            
            //load annotation data
            //AXML.Reader reader = new AXML.Reader(masterDirectory, aDataDirectory + "\\" + AXML.Reader.DEFAULT_XML_FILE);
            //Extractor.aannotation = reader.parse();          
            //CHANGE: gathers training samples based on the first category only 
            Extractor.trainingTime = new Hashtable();//int[((AXML.Category)Extractor.aannotation.Categories[0]).Labels.Count];
            //for (int i = 0; (i < Extractor.trainingTime.Length); i++)
            foreach (AXML.Label label in ((AXML.Category)Extractor.aannotation.Categories[0]).Labels)
                Extractor.trainingTime.Add(label.Name, 0);
                //Extractor.trainingTime[i] = 0;
            Extractor.trainingCompleted = false;

            Extractor.inputRowSize = sannotation.Sensors.Count * 3;
            Extractor.fftInterpolationPower = dconfiguration.FFTInterpolatedPower;
            Extractor.fftMaximumFrequencies = dconfiguration.FFTMaximumFrequencies;
            //Extractor.trainingTimePerClass = configuration.TrainingTime;
            //Extractor.trainingWaitTime = configuration.TrainingWaitTime;         
            Extractor.inputColumnSize = (int)Math.Pow(2, Extractor.fftInterpolationPower);


            Extractor.num_features = Extractor.inputRowSize; // number of distances
            Extractor.num_features += 1; //total mean;
            Extractor.num_features += Extractor.inputRowSize; // number of variances
            Extractor.num_features += Extractor.inputRowSize; // number of ranges
            Extractor.num_features += 2 * Extractor.fftMaximumFrequencies * Extractor.inputRowSize; // number of fft magnitudes and frequencies
            Extractor.num_features += Extractor.inputRowSize; // number of energies
            Extractor.num_features += ((Extractor.inputRowSize * Extractor.inputRowSize) - Extractor.inputRowSize) / 2; //correlation coefficients off-di
            Extractor.features = new double[Extractor.num_features];
            Extractor.arffAttriburesLabels = new string[Extractor.num_features];

            Extractor.standardized = new double[inputRowSize][];
            for (int i = 0; (i < inputRowSize); i++)
                Extractor.standardized[i] = new double[Extractor.inputColumnSize];//input[0].Length];

            Extractor.means = new double[inputRowSize];

            inputFFT = new int[Extractor.inputColumnSize];
            FFT.Initialize(fftInterpolationPower, fftMaximumFrequencies);
            Extractor.aMITesDecoder = aMITesDecoder;

            //Create the ARFF File header
            string arffHeader = "@RELATION wockets\n\n" + Extractor.GetArffHeader();//sannotation.Sensors.Count * 3, configuration.FFTMaximumFrequencies);
            arffHeader += "@ATTRIBUTE activity {";
            foreach (AXML.Label label in ((AXML.Category)Extractor.aannotation.Categories[0]).Labels)
                arffHeader += label.Name.Replace(' ', '_') + ",";
            arffHeader += "unknown}\n";
            arffHeader += "\n@DATA\n\n";

            //Calculating windowing parameters

            //total number of points per interpolated window
            Extractor.INTERPOLATED_SAMPLING_RATE_PER_WINDOW = (int)Math.Pow(2, dconfiguration.FFTInterpolatedPower); //128;  
            //expected sampling rate per MITes
            Extractor.EXPECTED_SAMPLING_RATE = dconfiguration.ExpectedSamplingRate / sannotation.Sensors.Count; //samples per second
            //expected samples per window
            Extractor.EXPECTED_WINDOW_SIZE = (int)(EXPECTED_SAMPLING_RATE * (dconfiguration.WindowTime / 1000.0)); // expectedSamplingRate per window
            //what would be considered a good sampling rate
            Extractor.EXPECTED_GOOD_SAMPLING_RATE = EXPECTED_WINDOW_SIZE - (int)(dconfiguration.MaximumNonconsecutiveFrameLoss * EXPECTED_WINDOW_SIZE); //number of packets lost per second                      
            //space between samples
            Extractor.EXPECTED_SAMPLES_SPACING = (double)dconfiguration.WindowTime / EXPECTED_WINDOW_SIZE;
            //space between interpolated samples
            Extractor.INTERPOLATED_SAMPLES_SPACING = (double)dconfiguration.WindowTime / INTERPOLATED_SAMPLING_RATE_PER_WINDOW;

            //window counters and delimiters
            Extractor.next_window_end = 0;
            Extractor.total_window_count = 0;
            Extractor.num_feature_windows = 0;

            //data quality variables
            Extractor.isAcceptableLossRate = true;
            Extractor.isAcceptableConsecutiveLoss = true;
            Extractor.unacceptable_window_count = 0;
            Extractor.unacceptable_consecutive_window_loss_count = 0;


            //2 D array that stores Sensor axes + time stamps on each row  X expected WINDOW SIZE
            Extractor.data = new double[Extractor.sannotation.Sensors.Count * 4][]; // 1 row for each axis

            // 2D array that stores Sensor axes X INTERPOLATED WINDOW SIZE
            Extractor.interpolated_data = new double[Extractor.sannotation.Sensors.Count * 3][];

            // array to store the y location for each axes as data is received
            // will be different for every sensor of course
            Extractor.y_index = new int[Extractor.sannotation.Sensors.Count];


            //Initialize expected data array
            for (int j = 0; (j < (Extractor.sannotation.Sensors.Count * 4)); j++)
            {
                Extractor.data[j] = new double[EXPECTED_WINDOW_SIZE];
                for (int k = 0; (k < EXPECTED_WINDOW_SIZE); k++)
                    Extractor.data[j][k] = 0;
            }

            //Initialize interpolated data array
            for (int j = 0; (j < (Extractor.sannotation.Sensors.Count * 3)); j++)
            {
                Extractor.interpolated_data[j] = new double[INTERPOLATED_SAMPLING_RATE_PER_WINDOW];
                for (int k = 0; (k < INTERPOLATED_SAMPLING_RATE_PER_WINDOW); k++)
                    Extractor.interpolated_data[j][k] = 0;
            }

            //Initialize y index for each sensor
            for (int j = 0; (j < Extractor.sannotation.Sensors.Count); j++)
                Extractor.y_index[j] = 0;

        }