public bool FillDemandOnTable(ref RSATable table, Graph graph, Demand demand, GraphPath path, List <AvailableSlot> availableSlots, bool protection = false)
        {
            List <GraphLink> pathLinks = path.ToLinks(graph.Links);

            double            totalDistance = pathLinks.Sum(r => r.Length);
            IModulationFormat format        = null;
            int multiplier = 1;

            do
            {
                format = GetModulationFormat(demand, totalDistance, multiplier);
                multiplier++;
            } while (format == null);


            int numberOfSlots = (int)Math.Ceiling(demand.DemandInGBps / table.LinkCapacity);

            List <List <int> > emptySlots = new List <List <int> >();

            foreach (var column in table.Table.Keys)
            {
                var reference = availableSlots.FirstOrDefault(r => r.Link.GetLinkId() == column);
                if (reference != null)
                {
                    emptySlots.Add(new List <int>(reference.Availables));
                }
            }

            List <int> intersection = emptySlots.First();

            foreach (var list in emptySlots.Skip(1))
            {
                intersection = intersection.Intersect(list).ToList();
            }

            List <int> indexesToFill = GetIndexesToFill(intersection, numberOfSlots);

            if (indexesToFill == null)
            {
                return(false);
            }

            foreach (GraphLink link in pathLinks)
            {
                foreach (var slot in indexesToFill)
                {
                    table.Table[link.GetLinkId()][slot].IsProtectionDemand = protection;
                    table.Table[link.GetLinkId()][slot].Values.Add(demand.Id.ToString());
                    table.Table[link.GetLinkId()][slot].ModulationFormat = format;
                }
            }

            return(true);
        }
        public bool FillDemandOnTable(ref RSATable table, Graph graph, Demand demand, GraphPath path, List <AvailableSlot> availableSlots, bool protection = false)
        {
            List <GraphLink> pathLinks = path.ToLinks(graph.Links);

            List <List <int> > emptySlots = new List <List <int> >();

            foreach (var column in table.Table.Keys)
            {
                var reference = availableSlots.FirstOrDefault(r => r.Link.GetLinkId() == column);
                if (reference != null)
                {
                    emptySlots.Add(new List <int>(reference.Availables));
                }
            }

            List <int> intersection = emptySlots.First();

            foreach (var list in emptySlots.Skip(1))
            {
                intersection = intersection.Intersect(list).ToList();
            }

            List <int> indexesToFill = GetIndexesToFill(intersection, demand.Slots);

            if (indexesToFill == null)
            {
                return(false);
            }

            foreach (GraphLink link in pathLinks)
            {
                foreach (var slot in indexesToFill)
                {
                    table.Table[link.GetLinkId()][slot].IsProtectionDemand = protection;
                    table.Table[link.GetLinkId()][slot].Values.Add(demand.Id.ToString());
                }
            }

            return(true);
        }