Skip to content

Commit

Permalink
now 'postload' option affects more filters. refs #14528
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Mar 18, 2024
1 parent 64c4a14 commit 06cae88
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 28 deletions.
98 changes: 73 additions & 25 deletions src/netbuild/NBEdgeCont.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void
NBEdgeCont::applyOptions(OptionsCont& oc) {
// set edges dismiss/accept options
myEdgesMinSpeed = oc.getFloat("keep-edges.min-speed");
myRemoveEdgesAfterJoining = oc.exists("keep-edges.postload") && oc.getBool("keep-edges.postload");
myRemoveEdgesAfterLoading = oc.exists("keep-edges.postload") && oc.getBool("keep-edges.postload");
// we possibly have to load the edges to keep/remove
if (oc.isSet("keep-edges.input-file")) {
NBHelpers::loadEdgesFromFile(oc.getString("keep-edges.input-file"), myEdges2Keep);
Expand Down Expand Up @@ -201,22 +201,32 @@ NBEdgeCont::insert(NBEdge* edge, bool ignorePrunning) {

bool
NBEdgeCont::ignoreFilterMatch(NBEdge* edge) {
// remove edges which allow a speed below a set one (set using "keep-edges.min-speed")
if (edge->getSpeed() < myEdgesMinSpeed) {
return true;
}
// check whether the edge is a named edge to keep
if (!myRemoveEdgesAfterJoining && myEdges2Keep.size() != 0) {
if (myEdges2Keep.count(edge->getID()) == 0) {
// explicit whitelisting may be combined additively with other filters
if (myVehicleClasses2Keep == 0 && myVehicleClasses2Remove == 0
&& myTypes2Keep.size() == 0 && myTypes2Remove.size() == 0
&& myPruningBoundary.size() == 0) {
return true;
if (!myRemoveEdgesAfterLoading) {
// check whether the edge is a named edge to keep
if (myEdges2Keep.size() != 0) {
if (myEdges2Keep.count(edge->getID()) == 0) {
// explicit whitelisting may be combined additively with other filters
if (myVehicleClasses2Keep == 0 && myVehicleClasses2Remove == 0
&& myTypes2Keep.size() == 0 && myTypes2Remove.size() == 0
&& myPruningBoundary.size() == 0) {
return true;
}
} else {
// explicit whitelisting overrides other filters
return false;
}
} else {
// explicit whitelisting overrides other filters
return false;
}
// remove edges which allow a speed below a set one (set using "keep-edges.min-speed")
if (edge->getSpeed() < myEdgesMinSpeed) {
return true;
}
// check whether the edge shall be removed because it does not allow any of the wished classes
if (myVehicleClasses2Keep != 0 && (myVehicleClasses2Keep & edge->getPermissions()) == 0) {
return true;
}
// check whether the edge shall be removed due to allowing unwished classes only
if (myVehicleClasses2Remove != 0 && (myVehicleClasses2Remove | edge->getPermissions()) == myVehicleClasses2Remove) {
return true;
}
}
// check whether the edge is a named edge to remove
Expand All @@ -225,14 +235,6 @@ NBEdgeCont::ignoreFilterMatch(NBEdge* edge) {
return true;
}
}
// check whether the edge shall be removed because it does not allow any of the wished classes
if (myVehicleClasses2Keep != 0 && (myVehicleClasses2Keep & edge->getPermissions()) == 0) {
return true;
}
// check whether the edge shall be removed due to allowing unwished classes only
if (myVehicleClasses2Remove != 0 && (myVehicleClasses2Remove | edge->getPermissions()) == myVehicleClasses2Remove) {
return true;
}
// check whether the edge shall be removed because it does not have one of the requested types
if (myTypes2Keep.size() != 0) {
if (myTypes2Keep.count(edge->getTypeID()) == 0) {
Expand Down Expand Up @@ -710,7 +712,7 @@ NBEdgeCont::splitAt(NBDistrictCont& dc,
throw ProcessError(TL("Could not set connection!"));
}
}
if (myRemoveEdgesAfterJoining) {
if (myRemoveEdgesAfterLoading) {
if (myEdges2Keep.count(edge->getID()) != 0) {
myEdges2Keep.insert(one->getID());
myEdges2Keep.insert(two->getID());
Expand Down Expand Up @@ -2138,4 +2140,50 @@ NBEdgeCont::getUsedTypes() const {
return result;
}


int
NBEdgeCont::removeEdgesBySpeed(NBDistrictCont& dc) {
EdgeSet toRemove;
for (auto item : myEdges) {
NBEdge* edge = item.second;
// remove edges which allow a speed below a set one (set using "keep-edges.min-speed")
if (edge->getSpeed() < myEdgesMinSpeed) {
toRemove.insert(edge);
}
}
int numRemoved = 0;
for (NBEdge* edge : toRemove) {
// explicit whitelist overrides removal
if (myEdges2Keep.size() == 0 || myEdges2Keep.count(edge->getID()) == 0) {
erase(dc, edge);
numRemoved++;
}
}
return numRemoved;
}

int
NBEdgeCont::removeEdgesByPermissions(NBDistrictCont& dc) {
EdgeSet toRemove;
for (auto item : myEdges) {
NBEdge* edge = item.second;
// check whether the edge shall be removed because it does not allow any of the wished classes
if (myVehicleClasses2Keep != 0 && (myVehicleClasses2Keep & edge->getPermissions()) == 0) {
toRemove.insert(edge);
}
// check whether the edge shall be removed due to allowing unwished classes only
if (myVehicleClasses2Remove != 0 && (myVehicleClasses2Remove | edge->getPermissions()) == myVehicleClasses2Remove) {
toRemove.insert(edge);
}
}
int numRemoved = 0;
for (NBEdge* edge : toRemove) {
// explicit whitelist overrides removal
if (myEdges2Keep.size() == 0 || myEdges2Keep.count(edge->getID()) == 0) {
erase(dc, edge);
numRemoved++;
}
}
return numRemoved;
}
/****************************************************************************/
8 changes: 6 additions & 2 deletions src/netbuild/NBEdgeCont.h
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,10 @@ class NBEdgeCont {
/// @brief return all edge types in used
std::set<std::string> getUsedTypes() const;

/// @brief return number of edges removed
int removeEdgesBySpeed(NBDistrictCont& dc);
int removeEdgesByPermissions(NBDistrictCont& dc);

private:
/// @brief compute the form factor for a loop of edges
static double formFactor(const EdgeVector& loopEdges);
Expand Down Expand Up @@ -748,8 +752,8 @@ class NBEdgeCont {
/// @brief The minimum speed an edge may have in order to be kept (default: -1)
double myEdgesMinSpeed;

/// @brief Whether edges shall be joined first, then removed
bool myRemoveEdgesAfterJoining;
/// @brief Whether edges shall be joined and patched first, then removed
bool myRemoveEdgesAfterLoading;

/// @brief Set of ids of edges which shall explicitly be kept
std::set<std::string> myEdges2Keep;
Expand Down
2 changes: 1 addition & 1 deletion src/netbuild/NBFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,7 @@ NBFrame::fillOptions(OptionsCont& oc, bool forNetgen) {

if (!forNetgen) {
oc.doRegister("keep-edges.postload", new Option_Bool(false));
oc.addDescription("keep-edges.postload", "Edge Removal", TL("Remove edges after joining"));
oc.addDescription("keep-edges.postload", "Edge Removal", TL("Remove edges after loading, patching and joining"));
}

oc.doRegister("keep-edges.in-boundary", new Option_StringVector());
Expand Down
8 changes: 8 additions & 0 deletions src/netbuild/NBNetBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ NBNetBuilder::compute(OptionsCont& oc, const std::set<std::string>& explicitTurn
myEdgeCont.removeUnwishedEdges(myDistrictCont);
PROGRESS_TIME_MESSAGE(before);
}
const int removed = myEdgeCont.removeEdgesBySpeed(myDistrictCont);
if (removed > 0) {
WRITE_MESSAGEF(TL(" Removed % edges because by minimum speed."), removed);
}
const int removed2 = myEdgeCont.removeEdgesByPermissions(myDistrictCont);
if (removed2 > 0) {
WRITE_MESSAGEF(TL(" Removed % edges based on vClass."), removed2);
}
}
// Processing pt stops and lines
if (!myPTStopCont.getStops().empty()) {
Expand Down

0 comments on commit 06cae88

Please sign in to comment.