static void Read_FIXED_EDGES_SECTION() { Node *Ni, *Nj; int i, j; CheckSpecificationPart(); if (!FirstNode) CreateNodes(); if (ProblemType == HPP) Dimension--; if (!fscanint(ProblemFile, &i)) i = -1; while (i != -1) { if (i <= 0 || i > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf("(FIXED_EDGES_SECTION) Node number out of range: %d", i); fscanint(ProblemFile, &j); if (j <= 0 || j > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf("(FIXED_EDGES_SECTION) Node number out of range: %d", j); if (i == j) eprintf("(FIXED_EDGES_SECTION) Illgal edge: %d to %d", i, j); if (ProblemType == ATSP) i += Dimension / 2; Ni = &NodeSet[i]; Nj = &NodeSet[j]; if (!Ni->FixedTo1) Ni->FixedTo1 = Nj; else if (!Ni->FixedTo2) Ni->FixedTo2 = Nj; else eprintf("(FIXED_EDGES_SECTION) Illegal fix: %d to %d", i, j); if (!Nj->FixedTo1) Nj->FixedTo1 = Ni; else if (!Nj->FixedTo2) Nj->FixedTo2 = Ni; else eprintf("(FIXED_EDGES_SECTION) Illegal fix: %d to %d", i, j); if (!fscanint(ProblemFile, &i)) i = -1; } if (ProblemType == HPP) Dimension++; }
static void Read_EDGE_WEIGHT_SECTION() { Node *Ni, *Nj; int i, j, n, W; CheckSpecificationPart(); if (!FirstNode) CreateNodes(); if (ProblemType != ATSP) { assert(CostMatrix = (int *) calloc((size_t) Dimension * (Dimension - 1) / 2, sizeof(int))); Ni = FirstNode->Suc; do { Ni->C = &CostMatrix[(size_t) (Ni->Id - 1) * (Ni->Id - 2) / 2] - 1; } while ((Ni = Ni->Suc) != FirstNode); } else { n = Dimension / 2; assert(CostMatrix = (int *) calloc((size_t) n * n, sizeof(int))); for (Ni = FirstNode; Ni->Id <= n; Ni = Ni->Suc) Ni->C = &CostMatrix[(size_t) (Ni->Id - 1) * n] - 1; } if (ProblemType == HPP) Dimension--; switch (WeightFormat) { case FULL_MATRIX: if (ProblemType == ATSP) { n = Dimension / 2; for (i = 1; i <= n; i++) { Ni = &NodeSet[i]; for (j = 1; j <= n; j++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; Ni->C[j] = W; if (i != j && W > M) M = W; } Nj = &NodeSet[i + n]; if (!Ni->FixedTo1) Ni->FixedTo1 = Nj; else if (!Ni->FixedTo2) Ni->FixedTo2 = Nj; if (!Nj->FixedTo1) Nj->FixedTo1 = Ni; else if (!Nj->FixedTo2) Nj->FixedTo2 = Ni; } Distance = Distance_ATSP; WeightType = -1; } else for (i = 1, Ni = FirstNode; i <= Dimension; i++, Ni = Ni->Suc) { for (j = 1; j <= Dimension; j++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; if (j < i) Ni->C[j] = W; } } break; case UPPER_ROW: for (i = 1, Ni = FirstNode; i < Dimension; i++, Ni = Ni->Suc) { for (j = i + 1, Nj = Ni->Suc; j <= Dimension; j++, Nj = Nj->Suc) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; Nj->C[i] = W; } } break; case LOWER_ROW: for (i = 2, Ni = FirstNode->Suc; i <= Dimension; i++, Ni = Ni->Suc) { for (j = 1; j < i; j++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; Ni->C[j] = W; } } break; case UPPER_DIAG_ROW: for (i = 1, Ni = FirstNode; i <= Dimension; i++, Ni = Ni->Suc) { for (j = i, Nj = Ni; j <= Dimension; j++, Nj = Nj->Suc) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; if (i != j) Nj->C[i] = W; } } break; case LOWER_DIAG_ROW: for (i = 1, Ni = FirstNode; i <= Dimension; i++, Ni = Ni->Suc) { for (j = 1; j <= i; j++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; if (j != i) Ni->C[j] = W; } } break; case UPPER_COL: for (j = 2, Nj = FirstNode->Suc; j <= Dimension; j++, Nj = Nj->Suc) { for (i = 1; i < j; i++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; Nj->C[i] = W; } } break; case LOWER_COL: for (j = 1, Nj = FirstNode; j < Dimension; j++, Nj = Nj->Suc) { for (i = j + 1, Ni = Nj->Suc; i <= Dimension; i++, Ni = Ni->Suc) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); Ni->C[j] = W; } } break; case UPPER_DIAG_COL: for (j = 1, Nj = FirstNode; j <= Dimension; j++, Nj = Nj->Suc) { for (i = 1; i <= j; i++) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; if (i != j) Nj->C[i] = W; } } break; case LOWER_DIAG_COL: for (j = 1, Nj = FirstNode; j <= Dimension; j++, Nj = Nj->Suc) { for (i = j, Ni = Nj; i <= Dimension; i++, Ni = Ni->Suc) { if (!fscanint(ProblemFile, &W)) eprintf("Missing weight in EDGE_WEIGHT_SECTION"); if (W > INT_MAX / 2 / Precision) W = INT_MAX / 2 / Precision; if (i != j) Ni->C[j] = W; } } break; } if (ProblemType == HPP) Dimension++; }
static void Read_EDGE_DATA_SECTION() { Node *Ni, *Nj; int i, j; CheckSpecificationPart(); if (!EdgeDataFormat) eprintf("Missing EDGE_DATA_FORMAT specification"); if (!FirstNode) CreateNodes(); if (ProblemType == HPP) Dimension--; if (!strcmp(EdgeDataFormat, "EDGE_LIST")) { if (!fscanint(ProblemFile, &i)) i = -1; while (i != -1) { if (i <= 0 || i > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf("(EDGE_DATA_SECTION) Node number out of range: %d", i); fscanint(ProblemFile, &j); if (j <= 0 || j > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf("(EDGE_DATA_SECTION) Node number out of range: %d", j); if (i == j) eprintf("(EDGE_DATA_SECTION) Illgal edge: %d to %d", i, j); if (ProblemType == ATSP) { i += Dimension / 2; j += Dimension / 2; } Ni = &NodeSet[i]; Nj = &NodeSet[j]; if (!Ni->CandidateSet) { Ni->V = 1; assert(Ni->CandidateSet = (Candidate *) calloc(2, sizeof(Candidate))); Ni->CandidateSet[0].To = Nj; Ni->CandidateSet[0].Cost = 0; } else { Ni->CandidateSet[Ni->V].To = Nj; Ni->CandidateSet[Ni->V].Cost = 0; assert(Ni->CandidateSet = (Candidate *) realloc(Ni->CandidateSet, (++Ni->V + 1) * sizeof(Candidate))); Ni->CandidateSet[Ni->V].To = 0; } if (!Nj->CandidateSet) { Nj->V = 1; assert(Nj->CandidateSet = (Candidate *) calloc(3, sizeof(Candidate))); Nj->CandidateSet[0].To = Ni; Nj->CandidateSet[0].Cost = 0; } else { Nj->CandidateSet[Nj->V].To = Ni; Nj->CandidateSet[Nj->V].Cost = 0; assert(Nj->CandidateSet = (Candidate *) realloc(Nj->CandidateSet, (++Nj->V + 1) * sizeof(Candidate))); Nj->CandidateSet[Nj->V].To = 0; } fscanint(ProblemFile, &i); } } else if (!strcmp(EdgeDataFormat, "ADJ_LIST")) { Ni = FirstNode; do Ni->V = 0; while ((Ni = Ni->Suc) != FirstNode); if (!fscanint(ProblemFile, &i)) i = -1; while (i != -1) { if (i <= 0 || i > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf("(EDGE_DATA_SECTION) Node number out of range: %d", i); if (ProblemType == ATSP) i += Dimension / 2; Ni = &NodeSet[i]; fscanint(ProblemFile, &j); while (j != -1) { if (j <= 0 || j > (ProblemType != ATSP ? Dimension : Dimension / 2)) eprintf ("(EDGE_DATA_SECTION) Node number out of range: %d", j); if (i == j) eprintf("(EDGE_DATA_SECTION) Illgal edge: %d to %d", i, j); if (ProblemType == ATSP) j += Dimension / 2; Nj = &NodeSet[j]; if (!Ni->CandidateSet) { Ni->V = 1; assert(Ni->CandidateSet = (Candidate *) calloc(3, sizeof(Candidate))); Ni->CandidateSet[0].To = Nj; Ni->CandidateSet[0].Cost = 0; } else { Ni->CandidateSet[Ni->V].To = Nj; Ni->CandidateSet[Ni->V].Cost = 0; assert(Ni->CandidateSet = (Candidate *) realloc(Ni->CandidateSet, (++Ni->V + 1) * sizeof(Candidate))); Ni->CandidateSet[Ni->V].To = 0; } if (!Nj->CandidateSet) { Nj->V = 1; assert(Nj->CandidateSet = (Candidate *) calloc(3, sizeof(Candidate))); Nj->CandidateSet[0].To = Ni; Nj->CandidateSet[0].Cost = 0; } else { Nj->CandidateSet[Nj->V].To = Ni; Nj->CandidateSet[Nj->V].Cost = 0; assert(Nj->CandidateSet = (Candidate *) realloc(Nj->CandidateSet, (++Nj->V + 1) * sizeof(Candidate))); Nj->CandidateSet[Nj->V].To = 0; } fscanint(ProblemFile, &j); } fscanint(ProblemFile, &i); } } else eprintf("(EDGE_DATA_SECTION) No EDGE_DATA_FORMAT specified"); if (ProblemType == HPP) Dimension++; Distance = Distance_1; }
// I inlined most of ReadProblem in my StEStructTSP code. // Need to invoke CreateNodes, which is declared static here. // Also invoke CheckSpecification while I am at it. void EStructTSP_CreateNodes() { CheckSpecificationPart(); CreateNodes(); }