bool TestListInsertBefore(List *list) { if (!ListEmpty(list)) { sprintf(error, "This test requires list to be empty"); return false; } int i; int k = 5; for (i = length-k; i < length; i++) ListAppend(list, numbers[i]); // Already tested for (i = k - 1; i >= 0; i--) ListPrepend(list, numbers[i]); // Already tested ListItor itor = ListTail(list); for (i = 0; i < k-1; i++) itor = ListItorPrev(itor); for (i = k; i < length - k; i++) if (!ListInsertBefore(itor, numbers[i])) { sprintf(error, "ListInsertBefore failed"); return false; } if (!VerifyListConsistency(list)) { sprintf(error, "List is not consistent with numbers after ListInsertBefore"); return false; } return true; }
void createListNodeWithData(List *nodesList, List *N) { for (ListElem *elem1 = ListFirst(nodesList); elem1 != NULL; elem1 = ListNext(nodesList, elem1)) { /* Get the current node */ Node_t *node1 = (Node_t *)elem1->obj; if (node1->priority != 0) { /* Insert in the right position inside list N */ ListElem *elem2 = ListFirst(N); while (elem2 != NULL) { Node_t *node2 = (Node_t *)elem2->obj; /* Checking the priority and the node id */ if ((node1->priority < node2->priority) || \ ((node1->priority == node2->priority) && (node1->id > node2->id))) { elem2 = ListNext(N, elem2); } else { ListInsertBefore(N, elem1->obj, elem2); break; } } /* If sorted_list is empty or elem1 is smaller than everyone in the sorted list */ if (elem2 == NULL) { ListAppend(N, elem1->obj); } } } }
uint8_t fhssDistributedBlacklistMABFirstBestArmChan(Node_t *parent, Node_t *child, uint64_t asn) { uint8_t freq = 0; /* Every epsilon_ts_incr_n time slots we divide increment epsilon_n */ if ((epsilon_ts_incr_n != 0) && ((asn + 1) % epsilon_ts_incr_n) == 0) { if (++epsilon_n == epsilon_max_n) { epsilon_n = epsilon_init_n; PRINTF("Reseting Epsilon to %ld at %lld\n", (long)epsilon_init_n, (long long)asn); } } if ((rand() % epsilon_n) == 0) { /* We will explore all channels randomly */ return (fhssDistributedBlacklistMABExplore(parent, asn)); } else { /* Lets order all channel sorting by average_reward */ List ordered_channel; memset(&ordered_channel, 0, sizeof(List)); ListInit(&ordered_channel); for (uint8_t i = 0; i < NUM_CHANNELS; i++) { ListElem *elem; for (elem = ListFirst(&ordered_channel); elem != NULL; elem = ListNext(&ordered_channel, elem)) { uint8_t channel = (uint8_t)elem->obj; if (parent->avg_reward[child->id][i] > parent->avg_reward[child->id][channel]) { ListInsertBefore(&ordered_channel, (void *)i, elem); break; } } if (elem == NULL) { ListAppend(&ordered_channel, (void *)i); } } /* Create a blacklist with the first best MAB_FIRST_BEST_ARMS channels */ uint16_t blacklist = 0; uint8_t n_channels = 1; for (ListElem *elem = ListFirst(&ordered_channel); elem != NULL; elem = ListNext(&ordered_channel, elem)) { uint8_t channel = (uint8_t)elem->obj; blacklist |= (1 << channel); /* Check if we already got the MAB_FIRST_BEST_ARMS first best channels */ if (++n_channels > mab_first_best_arms) { break; } } for (ListElem *elem = ListFirst(&parent->channels); elem != NULL; elem = ListNext(&parent->channels, elem)) { uint8_t freq_off = (uint8_t)elem->obj; freq = fhssOpenwsnChan(freq_off, asn); if (blacklist & (1 << freq)) { return (freq); } } return (freq); } return 0; }