public void print_node_revision_info(node_revision_info info)
 {
     Console.Write("{0}, ", info.number_of_revision);
     Console.Write("{0}, ", info.outlink_vector_size);
     Console.Write("{0}, ", info.first_time_stamp.ToString());
     for (int i = 0; i < info.number_of_revision; i++)
     {
         Console.Write("{0}, ", info.first_time_stamp.AddSeconds(info.time_duration[i]).ToString());
         //Console.Write("{0}, ", Convert.ToDateTime(info.first_time_stamp).AddSeconds(info.time_duration[i]));
         for (int j = 0; j < info.revision_matrix[i].Length; j++)
         {
             Console.Write("{0}, ", info.revision_matrix[i][j]);
         }
     }
     Console.WriteLine();
 }
    public SortedDictionary <string, long> getOutlinkInDuration(long nodeId, long[] uids, string[] urls, DateTime start_date, DateTime end_date)
    {
        node_revision_info info = getNodeInfo(nodeId);

        //Console.Write("{0}, ", nodeId);
        //print_node_revision_info(info);

        if (start_date > end_date)
        {
            return(null);
        }

        long dist_start = (long)(start_date - info.first_time_stamp).TotalSeconds;
        long dist_end   = (long)(end_date - info.first_time_stamp).TotalSeconds;

        //DateTime first_time_stamp = Convert.ToDateTime(info.first_time_stamp);
        //long dist_start = (first_time_stamp - start_date).Milliseconds;
        //long dist_end = (first_time_stamp - end_date).Milliseconds;
        byte[] union_vector = new byte[(int)Math.Ceiling((double)(info.outlink_vector_size / 8.0))];

        List <long> final_outlink = new List <long>();


        for (int i = 0; i < union_vector.Length; i++)  // byte vector
        {
            union_vector[i] = 0;
        }
        for (int i = 0; i < info.number_of_revision; i++)
        {
            //Console.WriteLine("Current {0}, {1}, {2}, {3}", dist_start, dist_end, info.first_time_stamp.ToString(), info.first_time_stamp.AddSeconds(info.time_duration[i]).ToString());

            if (info.time_duration[i] < dist_end && info.time_duration[i] > dist_start)
            {
                for (int k = 0; k < union_vector.Length; k++)
                {
                    //Console.Write("{0}|{1}={2}", info.revision_matrix[i][k], union_vector[k], (byte)(info.revision_matrix[i][k] | union_vector[k]));
                    union_vector[k] = (byte)(info.revision_matrix[i][k] | union_vector[k]);
                }
                //Console.WriteLine();
            }
        }

        //for (int k = 0; k < union_vector.Length; k++)
        //{
        //    Console.Write("{0}, ", union_vector[k]);
        //}
        //Console.WriteLine();

        SortedDictionary <string, long> dict = new SortedDictionary <string, long>();

        for (int i = 0; i < uids.Length; i++)  // byte vector
        {
            dict.Add(urls[i], uids[i]);
        }

        dict.Values.CopyTo(uids, 0);


        for (int i = 0; i < info.outlink_vector_size; i++)
        {
            if (link_at_index(union_vector, i) == 0)
            {
                dict.Remove(urls[i]);
            }
        }
        return(dict);
    }