pub enum DynamicNetEdit<'a, Edit>{
Default(&'a mut Net),
Simulated(Edit),
}Expand description
A type for editing a dynamic net safely.
Variants§
Default(&'a mut Net)
A editable reference to a default net.
Simulated(Edit)
A editable reference to a simulated net.
Implementations§
Source§impl<'a, Edit> DynamicNetEdit<'a, Edit>
impl<'a, Edit> DynamicNetEdit<'a, Edit>
Sourcepub fn add_place(&mut self) -> Id<Place>
pub fn add_place(&mut self) -> Id<Place>
Add a new place to the petri net and get the index and refresh states if necessary.
Sourcepub fn add_transition(&mut self) -> Id<Transition>
pub fn add_transition(&mut self) -> Id<Transition>
Add a new transition to the petri net and get the index and refresh states if necessary.
Sourcepub fn add_connected_transition(
&mut self,
in_pids: &[Id<Place>],
out_pids: &[Id<Place>],
) -> Id<Transition>
pub fn add_connected_transition( &mut self, in_pids: &[Id<Place>], out_pids: &[Id<Place>], ) -> Id<Transition>
Add a new transition to the petri net, connct it to the specified places and get the index and refresh states if necessary.
Sourcepub fn remove_place(&mut self, pid: Id<Place>)
pub fn remove_place(&mut self, pid: Id<Place>)
Remove a place at index pid from petri net and refresh states if necessary.
Sourcepub fn connect_place_to_transition(
&mut self,
pid: Id<Place>,
tid: Id<Transition>,
) -> bool
pub fn connect_place_to_transition( &mut self, pid: Id<Place>, tid: Id<Transition>, ) -> bool
Make a connection in to the transition with index tid from place with index pid and refresh states if necessary.
Result represents success.
Sourcepub fn connect_transition_to_place(
&mut self,
tid: Id<Transition>,
pid: Id<Place>,
) -> bool
pub fn connect_transition_to_place( &mut self, tid: Id<Transition>, pid: Id<Place>, ) -> bool
Make a connection out from the transition with index tid to place with index pid and refresh states if necessary.
Result represents success.
Sourcepub fn duplicate_transition(&mut self, tid: Id<Transition>) -> Id<Transition>
pub fn duplicate_transition(&mut self, tid: Id<Transition>) -> Id<Transition>
Duplicate the transition and get the index of the clone and refresh states if necessary.
Sourcepub fn duplicate_place(&mut self, pid: Id<Place>) -> Id<Place>
pub fn duplicate_place(&mut self, pid: Id<Place>) -> Id<Place>
Duplicate the place and get the index of the clone and refresh states if necessary.
Sourcepub fn add_initial_tokens(&mut self, pid: Id<Place>, count: usize) -> usize
pub fn add_initial_tokens(&mut self, pid: Id<Place>, count: usize) -> usize
Increase the initial token count in place indexed by pid and refresh states if necessary.
Methods from Deref<Target = Net>§
Sourcepub fn save(&self, filename: &Path) -> Result<(), Error>
pub fn save(&self, filename: &Path) -> Result<(), Error>
Save the petri net to a file. Result represents success.
Examples found in repository?
13fn main() -> ExitCode {
14 let mut save = false;
15 let mut load = false;
16
17 let mut args = std::env::args();
18 args.next();
19 for arg in args {
20 match arg.as_ref() {
21 "save" => save = true,
22 "load" => load = true,
23 _ => eprintln!("Ignore invalid argument '{arg}'"),
24 }
25 }
26
27 let Ok(net) = Net::load("examples/example.pn".as_ref()) else {
28 eprintln!("Failed to load example net");
29 return ExitCode::FAILURE;
30 };
31 let mut net = SimulatedNet::new(net);
32
33 let mut names = HashMap::new();
34 let Ok(file) = File::open("examples/example.pnk") else {
35 eprintln!("Failed to load example keys");
36 return ExitCode::FAILURE;
37 };
38 for (tid, line) in net.transition_ids().zip(BufReader::new(file).lines()) {
39 let Ok(line) = line else {
40 eprintln!("Failed to read key");
41 return ExitCode::FAILURE;
42 };
43 names.insert(tid, line);
44 }
45
46 if save && net.save("examples/example_copy.pns".as_ref()).is_err() {
47 eprintln!("Failed to save example net");
48 }
49
50 if load {
51 fn read_values(filename: &Path) -> std::io::Result<Vec<u32>> {
52 let size = (std::fs::metadata(filename)?.len() + 3) / 4;
53
54 let mut file = File::open(filename)?;
55
56 (0..size)
57 .map(|_| {
58 let mut value = [0; 4];
59 file.read_exact(&mut value)?;
60 Ok(u32::from_le_bytes(value))
61 })
62 .collect()
63 }
64
65 let Ok(data) = read_values("examples/example.pns".as_ref()) else {
66 eprintln!("Reading state data failed");
67 return ExitCode::FAILURE;
68 };
69
70 if net.add_simulation_from_data(data).is_err() {
71 eprintln!("State initialization failed");
72 return ExitCode::FAILURE;
73 }
74 } else {
75 net.add_simulation();
76 }
77
78 enum StepAction {
79 Continue,
80 Reverse,
81 Save,
82 Quit,
83 }
84
85 let mut forward = true;
86 for mut simulation in &mut net {
87 fn step<D: FireDirection>(
88 fire: FireState<SimulationStateMut, D>,
89 names: &HashMap<Tid, String>,
90 ) -> StepAction {
91 if fire.callables.is_empty() {
92 return StepAction::Reverse;
93 }
94
95 for (i, tid) in fire.callables.iter().enumerate() {
96 println!("{}: {}", i + 1, names[tid]);
97 }
98 let stdin = io::stdin();
99 let mut string = String::new();
100 let Ok(size) = stdin.read_line(&mut string) else {
101 eprintln!("Input error");
102 return StepAction::Continue;
103 };
104 if size == 0 {
105 return StepAction::Continue;
106 }
107 match unsafe { string.chars().next().unwrap_unchecked() } {
108 'r' => return StepAction::Reverse,
109 'q' => return StepAction::Quit,
110 's' => return StepAction::Save,
111 _ => (),
112 }
113 match usize::from_str(&string[..(string.len() - 1)]) {
114 Ok(num) if num != 0 && num <= fire.callables.len() => {
115 fire.call(num - 1);
116 }
117 _ => {
118 println!(
119 "You have to input a valid number from 1 to {}",
120 fire.callables.len()
121 );
122 println!("You can also quit by writing \"q\", save the current state by writing \"s\" or reverse by writing \"r\"");
123 return StepAction::Continue;
124 }
125 }
126
127 StepAction::Continue
128 }
129
130 loop {
131 let step_action = if forward {
132 step(simulation.prepare_call(), &names)
133 } else {
134 step(simulation.prepare_revert(), &names)
135 };
136
137 use StepAction::*;
138 match step_action {
139 Continue => (),
140 Reverse => {
141 println!("Reverse play direction!");
142 forward = !forward;
143 }
144 Save => {
145 fn save(data: &[usize], filename: &Path) -> std::io::Result<()> {
146 let mut file = File::create(filename)?;
147 for &count in data {
148 file.write_all(&(count as u32).to_le_bytes())?;
149 }
150
151 Ok(())
152 }
153
154 let data = simulation.data();
155
156 println!(
157 "{}",
158 if save(data, "examples/example.pns".as_ref()).is_ok() {
159 "Saving successful"
160 } else {
161 "Saving failed"
162 }
163 );
164 }
165 Quit => break,
166 }
167 }
168 }
169
170 ExitCode::SUCCESS
171}Sourcepub fn transition_count(&self) -> usize
pub fn transition_count(&self) -> usize
The count of transitions of the petri net.
Sourcepub fn transition_ids(&self) -> Ids<Transition>
pub fn transition_ids(&self) -> Ids<Transition>
An iterator over the ids of existing transitions.
Examples found in repository?
13fn main() -> ExitCode {
14 let mut save = false;
15 let mut load = false;
16
17 let mut args = std::env::args();
18 args.next();
19 for arg in args {
20 match arg.as_ref() {
21 "save" => save = true,
22 "load" => load = true,
23 _ => eprintln!("Ignore invalid argument '{arg}'"),
24 }
25 }
26
27 let Ok(net) = Net::load("examples/example.pn".as_ref()) else {
28 eprintln!("Failed to load example net");
29 return ExitCode::FAILURE;
30 };
31 let mut net = SimulatedNet::new(net);
32
33 let mut names = HashMap::new();
34 let Ok(file) = File::open("examples/example.pnk") else {
35 eprintln!("Failed to load example keys");
36 return ExitCode::FAILURE;
37 };
38 for (tid, line) in net.transition_ids().zip(BufReader::new(file).lines()) {
39 let Ok(line) = line else {
40 eprintln!("Failed to read key");
41 return ExitCode::FAILURE;
42 };
43 names.insert(tid, line);
44 }
45
46 if save && net.save("examples/example_copy.pns".as_ref()).is_err() {
47 eprintln!("Failed to save example net");
48 }
49
50 if load {
51 fn read_values(filename: &Path) -> std::io::Result<Vec<u32>> {
52 let size = (std::fs::metadata(filename)?.len() + 3) / 4;
53
54 let mut file = File::open(filename)?;
55
56 (0..size)
57 .map(|_| {
58 let mut value = [0; 4];
59 file.read_exact(&mut value)?;
60 Ok(u32::from_le_bytes(value))
61 })
62 .collect()
63 }
64
65 let Ok(data) = read_values("examples/example.pns".as_ref()) else {
66 eprintln!("Reading state data failed");
67 return ExitCode::FAILURE;
68 };
69
70 if net.add_simulation_from_data(data).is_err() {
71 eprintln!("State initialization failed");
72 return ExitCode::FAILURE;
73 }
74 } else {
75 net.add_simulation();
76 }
77
78 enum StepAction {
79 Continue,
80 Reverse,
81 Save,
82 Quit,
83 }
84
85 let mut forward = true;
86 for mut simulation in &mut net {
87 fn step<D: FireDirection>(
88 fire: FireState<SimulationStateMut, D>,
89 names: &HashMap<Tid, String>,
90 ) -> StepAction {
91 if fire.callables.is_empty() {
92 return StepAction::Reverse;
93 }
94
95 for (i, tid) in fire.callables.iter().enumerate() {
96 println!("{}: {}", i + 1, names[tid]);
97 }
98 let stdin = io::stdin();
99 let mut string = String::new();
100 let Ok(size) = stdin.read_line(&mut string) else {
101 eprintln!("Input error");
102 return StepAction::Continue;
103 };
104 if size == 0 {
105 return StepAction::Continue;
106 }
107 match unsafe { string.chars().next().unwrap_unchecked() } {
108 'r' => return StepAction::Reverse,
109 'q' => return StepAction::Quit,
110 's' => return StepAction::Save,
111 _ => (),
112 }
113 match usize::from_str(&string[..(string.len() - 1)]) {
114 Ok(num) if num != 0 && num <= fire.callables.len() => {
115 fire.call(num - 1);
116 }
117 _ => {
118 println!(
119 "You have to input a valid number from 1 to {}",
120 fire.callables.len()
121 );
122 println!("You can also quit by writing \"q\", save the current state by writing \"s\" or reverse by writing \"r\"");
123 return StepAction::Continue;
124 }
125 }
126
127 StepAction::Continue
128 }
129
130 loop {
131 let step_action = if forward {
132 step(simulation.prepare_call(), &names)
133 } else {
134 step(simulation.prepare_revert(), &names)
135 };
136
137 use StepAction::*;
138 match step_action {
139 Continue => (),
140 Reverse => {
141 println!("Reverse play direction!");
142 forward = !forward;
143 }
144 Save => {
145 fn save(data: &[usize], filename: &Path) -> std::io::Result<()> {
146 let mut file = File::create(filename)?;
147 for &count in data {
148 file.write_all(&(count as u32).to_le_bytes())?;
149 }
150
151 Ok(())
152 }
153
154 let data = simulation.data();
155
156 println!(
157 "{}",
158 if save(data, "examples/example.pns".as_ref()).is_ok() {
159 "Saving successful"
160 } else {
161 "Saving failed"
162 }
163 );
164 }
165 Quit => break,
166 }
167 }
168 }
169
170 ExitCode::SUCCESS
171}Sourcepub fn transition(&self, tid: Id<Transition>) -> &Node<Id<Place>>
pub fn transition(&self, tid: Id<Transition>) -> &Node<Id<Place>>
A node representing a transition of the petri net.
Sourcepub fn reusable_transition(&self) -> Option<Id<Transition>>
pub fn reusable_transition(&self) -> Option<Id<Transition>>
Returns the index of the next reusable transition.
Sourcepub fn place_count(&self) -> usize
pub fn place_count(&self) -> usize
The count of places of the petri net.
Sourcepub fn place(&self, pid: Id<Place>) -> &Node<Id<Transition>>
pub fn place(&self, pid: Id<Place>) -> &Node<Id<Transition>>
A node representing a place of the petri net.
Sourcepub fn reusable_place(&self) -> Option<Id<Place>>
pub fn reusable_place(&self) -> Option<Id<Place>>
Returns the index of the next reusable place.
Sourcepub fn initial_token_count(&self, pid: Id<Place>) -> usize
pub fn initial_token_count(&self, pid: Id<Place>) -> usize
The initial token count for a place of the petri net.