int set_delta(int *delta, int *select, int *select_sizes, int size, struct t_trace_list *list){ int i; int remaining=0; int min=-1; int max=-1; int rand_choice; for(i=0 ; i < size; i++){ if(delta[i] == -1){ remaining++; continue; } } if(remaining == 0){ return EXIT_SUCCESS; } rand_choice = rand() % size; while(delta[rand_choice] != -1){ rand_choice = rand() % size; } if(remaining == size){ delta[rand_choice] = 0; return set_delta(delta, select, select_sizes, size, list); } for(i=0 ; i < size ; i++){ if(delta[i] == -1){ continue; } if((min == -1) || (max == -1)){ min = delta[i]; max = list->trace_list[select[i]]->pkt_list[list->trace_list[select[i]]->num_elements-1]->time; continue; } if(delta[i] < min){ min = delta[i]; } if(list->trace_list[select[i]]->pkt_list[list->trace_list[select[i]]->num_elements-1]->time > max){ max = list->trace_list[select[i]]->pkt_list[list->trace_list[select[i]]->num_elements-1]->time; } } if((max-min) <= 0){ delta[rand_choice] = min; } else{ delta[rand_choice] = (rand() % (max - min))+min; } return set_delta(delta, select, select_sizes, size, list); }
int main(int argc, char **argv){ struct t_trace_list *list; int i,j,k; int size; int *select; int *select_sizes; int *delta; int *label_list; int num_labels; int iterations; int max; list = load_t_trace_list(argv[1]); if(list == NULL){ return EXIT_FAILURE; } size = argc - 3; if(size <= 0){ return EXIT_FAILURE; } iterations = atoi(argv[2]); max = atoi(argv[3]); size = atoi(argv[4]); srand(time(NULL)); for( ; iterations > 0 ; iterations--){ select = (int *)malloc(sizeof(int) * size); select_sizes = (int *)malloc(sizeof(int) * size); delta = (int *)malloc(sizeof(int) * size); num_labels = 0; for(i=0 ; i < size ; i++){ select[i] = rand() % max; select_sizes[i] = list->trace_list[select[i]]->num_elements; delta[i] = -1; num_labels += list->trace_list[select[i]]->num_labels; } label_list = (int *)malloc(sizeof(int) * num_labels); k=0; for(i=0 ; i < size ; i++){ for(j=0 ; j < list->trace_list[select[i]]->num_labels ; j++){ label_list[k++] = list->trace_list[select[i]]->label_list[j]; } } set_delta(delta, select, select_sizes, size, list); printf(":%d", label_list[0]); for(i=1 ; i < num_labels ; i++){ printf(",%d", label_list[i]); } printf("\n"); free(label_list); while(remaining_work(select_sizes, size)){ print_next_pkt(list, select, select_sizes, size, delta); } free(select); free(select_sizes); free(delta); } /*select = (int *)malloc(sizeof(int) * size); select_sizes = (int *)malloc(sizeof(int) * size); delta = (int *)malloc(sizeof(int) * size); num_labels = 0; for(i=0 ; i < size ; i++){ select[i] = atoi(argv[i+3]); select_sizes[i] = list->trace_list[select[i]]->num_elements; delta[i] = -1; num_labels += list->trace_list[select[i]]->num_labels; } label_list = (int *)malloc(sizeof(int) * num_labels); k=0; for(i=0 ; i < size ; i++){ for(j=0 ; j < list->trace_list[select[i]]->num_labels ; j++){ label_list[k++] = list->trace_list[select[i]]->label_list[j]; } } srand(time(NULL)); set_delta(delta, select, select_sizes, size, list); //printf(":%d\n", atoi(argv[2])); printf(":%d", label_list[0]); for(i=1 ; i < num_labels ; i++){ printf(",%d", label_list[i]); } printf("\n"); free(label_list); while(remaining_work(select_sizes, size)){ print_next_pkt(list, select, select_sizes, size, delta); }*/ return EXIT_SUCCESS; }
bool shape_record_factory(bit_stream_ptr bits, int version, unsigned& fill_bits, unsigned& line_bits, std::vector<shape_record_ptr>* records) { bool edge_record = bits->read_unsigned_bits(1) ? true : false; unsigned flags = unsigned(bits->read_unsigned_bits(5)); if(flags == 0) { bits->force_byte_align(); return false; } if(edge_record) { if(flags & 16) { // straight auto srp = std::make_shared<shape_record>(ShapeRecordTypes::LINE); unsigned num_bits = (flags & 0x0f) + 2; bool general_line = bits->read_unsigned_bits(1) ? true : false; delta_record dr; if(general_line) { dr.delta_x = int32_t(bits->read_unsigned_bits(num_bits)); dr.delta_y = int32_t(bits->read_unsigned_bits(num_bits)); } else { bool vertical_line = bits->read_unsigned_bits(1) ? true : false; if(vertical_line) { dr.delta_x = int32_t(bits->read_signed_bits(num_bits)); dr.delta_y = 0; } else { dr.delta_x = 0; dr.delta_y = int32_t(bits->read_signed_bits(num_bits)); } } srp->set_delta(dr); records->emplace_back(srp); return true; } else { auto cer = std::make_shared<curve_edge_record>(); unsigned num_bits = (flags & 0x0f) + 2; delta_record dr; dr.delta_x = int32_t(bits->read_signed_bits(num_bits)); dr.delta_y = int32_t(bits->read_signed_bits(num_bits)); cer->set_control(dr); dr.delta_x = int32_t(bits->read_signed_bits(num_bits)); dr.delta_y = int32_t(bits->read_signed_bits(num_bits)); cer->set_anchor(dr); records->emplace_back(cer); return true; } } else { if(flags & 1) { std::shared_ptr<move_record> mrp = std::make_shared<move_record>(); delta_record moves; unsigned move_bits = unsigned(bits->read_unsigned_bits(5)); moves.delta_x = int32_t(bits->read_signed_bits(move_bits)); moves.delta_y = int32_t(bits->read_signed_bits(move_bits)); mrp->set_delta(moves); records->emplace_back(mrp); } if(flags & (2|4|8|16)) { std::shared_ptr<style_change_record> srp = std::make_shared<style_change_record>(); if(flags & 2) { srp->set_fillstyle0_index(bits->read_unsigned_bits(fill_bits)); } if(flags & 4) { srp->set_fillstyle1_index(bits->read_unsigned_bits(fill_bits)); } if(flags & 8) { srp->set_linestyle_index(bits->read_unsigned_bits(line_bits)); } if(flags & 16) { styles ss; ss.fill_styles_ = bits->read_fillstyle_array(version); ss.line_styles_ = bits->read_linestyle_array(version); fill_bits = ss.fill_bits_ = bits->read_unsigned_bits(4); line_bits = ss.line_bits_ = bits->read_unsigned_bits(4); srp->set_styles(ss); } records->emplace_back(srp); } return true; } }