()
| 140 | } |
| 141 | |
| 142 | fn main() -> eyre::Result<()> { |
| 143 | color_eyre::install()?; |
| 144 | let args = CmdlineOptions::parse(); |
| 145 | |
| 146 | let filter = tracing_subscriber::EnvFilter::builder() |
| 147 | .with_default_directive(args.log_level.into()) |
| 148 | .from_env_lossy(); |
| 149 | tracing_subscriber::fmt() |
| 150 | .with_env_filter(filter) |
| 151 | .with_ansi(true) |
| 152 | .with_writer(std::io::stderr) |
| 153 | .init(); |
| 154 | |
| 155 | let seed = generate_random_seed_if_not_specified(args.seed); |
| 156 | tracing::info!("Seeding RNG with: {seed}"); |
| 157 | let mut rng = StdRng::seed_from_u64(seed); |
| 158 | |
| 159 | let reader = get_input_reader(&args.input)?; |
| 160 | let mut graph: GeometryGraph<Undirected> = read_tgf_graph(reader); |
| 161 | |
| 162 | let mut num_traversals = if args.random_traversals { |
| 163 | let n = args.traversals * 2; // changes mean |
| 164 | let p = 0.5; // changes skew |
| 165 | let dist = Binomial::new(n as u64, p)?; |
| 166 | dist.sample(&mut rng) |
| 167 | } else { |
| 168 | args.traversals as u64 |
| 169 | }; |
| 170 | if num_traversals == 0 { |
| 171 | num_traversals = 1; |
| 172 | } |
| 173 | tracing::debug!("Making {num_traversals} traversals"); |
| 174 | |
| 175 | let traversals = std::iter::repeat_with(|| { |
| 176 | let mut length = if args.random_length { |
| 177 | let n = args.traversals * 2; // changes mean |
| 178 | let p = 0.5; // changes skew |
| 179 | let dist = Binomial::new(n as u64, p).unwrap(); |
| 180 | dist.sample(&mut rng) |
| 181 | } else { |
| 182 | args.length as u64 |
| 183 | }; |
| 184 | if length < 2 { |
| 185 | length = 2; |
| 186 | } |
| 187 | tracing::debug!("Making random traversal with length {length}"); |
| 188 | random_traversal( |
| 189 | length as usize, |
| 190 | args.remove_after_traverse, |
| 191 | &mut graph, |
| 192 | &mut rng, |
| 193 | ) |
| 194 | }) |
| 195 | .take(num_traversals as usize) |
| 196 | .flatten() |
| 197 | .map(Geometry::LineString); |
| 198 | |
| 199 | let mut writer = get_output_writer(&args.output)?; |
nothing calls this directly
no test coverage detected