pub struct PetriNetInfo(/* private fields */);
Expand description
A wrapper type representing petri net for simulation.
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?
14fn main() -> ExitCode {
15 let mut save = false;
16 let mut load = false;
17
18 let mut args = std::env::args();
19 args.next();
20 for arg in args {
21 match arg.as_ref() {
22 "save" => save = true,
23 "load" => load = true,
24 _ => eprintln!("Ignore invalid argument '{arg}'"),
25 }
26 }
27
28 let Ok(net) = Net::load("examples/example.pn".as_ref()) else {
29 eprintln!("Failed to load example net");
30 return ExitCode::FAILURE;
31 };
32 let mut net = MultiPetriNetSimulation::new(net);
33
34 let mut names = HashMap::new();
35 let Ok(file) = File::open("examples/example.pnk") else {
36 eprintln!("Failed to load example keys");
37 return ExitCode::FAILURE;
38 };
39 for (tid, line) in net.transition_ids().zip(BufReader::new(file).lines()) {
40 let Ok(line) = line else {
41 eprintln!("Failed to read key");
42 return ExitCode::FAILURE;
43 };
44 names.insert(tid, line);
45 }
46
47 if save && net.save("examples/example_copy.pns".as_ref()).is_err() {
48 eprintln!("Failed to save example net");
49 }
50
51 if load {
52 fn read_values(filename: &Path) -> std::io::Result<Vec<u32>> {
53 let size = (std::fs::metadata(filename)?.len() + 3) / 4;
54
55 let mut file = File::open(filename)?;
56
57 (0..size)
58 .map(|_| {
59 let mut value = [0; 4];
60 file.read_exact(&mut value)?;
61 Ok(u32::from_le_bytes(value))
62 })
63 .collect()
64 }
65
66 let Ok(data) = read_values("examples/example.pns".as_ref()) else {
67 eprintln!("Reading state data failed");
68 return ExitCode::FAILURE;
69 };
70
71 if net.add_simulation_from_data(data).is_err() {
72 eprintln!("State initialization failed");
73 return ExitCode::FAILURE;
74 }
75 } else {
76 net.add_simulation();
77 }
78
79 enum StepAction {
80 Continue,
81 Reverse,
82 Save,
83 Quit,
84 }
85
86 let mut forward = true;
87 for mut simulation in &mut net {
88 fn step<D: PlayDirection>(
89 fire: CallState<PetriNetSimulationBorrowMut, D>,
90 names: &HashMap<Tid, String>,
91 ) -> StepAction {
92 if fire.callables.is_empty() {
93 return StepAction::Reverse;
94 }
95
96 for (i, tid) in fire.callables.iter().enumerate() {
97 println!("{}: {}", i + 1, names[tid]);
98 }
99 let stdin = io::stdin();
100 let mut string = String::new();
101 let Ok(size) = stdin.read_line(&mut string) else {
102 eprintln!("Input error");
103 return StepAction::Continue;
104 };
105 if size == 0 {
106 return StepAction::Continue;
107 }
108 match unsafe { string.chars().next().unwrap_unchecked() } {
109 'r' => return StepAction::Reverse,
110 'q' => return StepAction::Quit,
111 's' => return StepAction::Save,
112 _ => (),
113 }
114 match usize::from_str(&string[..(string.len() - 1)]) {
115 Ok(num) if num != 0 && num <= fire.callables.len() => {
116 fire.call(num - 1);
117 }
118 _ => {
119 println!(
120 "You have to input a valid number from 1 to {}",
121 fire.callables.len()
122 );
123 println!("You can also quit by writing \"q\", save the current state by writing \"s\" or reverse by writing \"r\"");
124 return StepAction::Continue;
125 }
126 }
127
128 StepAction::Continue
129 }
130
131 loop {
132 let step_action = if forward {
133 step(simulation.prepare_call(), &names)
134 } else {
135 step(simulation.prepare_revert(), &names)
136 };
137
138 use StepAction::*;
139 match step_action {
140 Continue => (),
141 Reverse => {
142 println!("Reverse play direction!");
143 forward = !forward;
144 }
145 Save => {
146 fn save(data: &[usize], filename: &Path) -> std::io::Result<()> {
147 let mut file = File::create(filename)?;
148 for &count in data {
149 file.write_all(&(count as u32).to_le_bytes())?;
150 }
151
152 Ok(())
153 }
154
155 let data = simulation.data();
156
157 println!(
158 "{}",
159 if save(data, "examples/example.pns".as_ref()).is_ok() {
160 "Saving successful"
161 } else {
162 "Saving failed"
163 }
164 );
165 }
166 Quit => break,
167 }
168 }
169 }
170
171 ExitCode::SUCCESS
172}
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?
14fn main() -> ExitCode {
15 let mut save = false;
16 let mut load = false;
17
18 let mut args = std::env::args();
19 args.next();
20 for arg in args {
21 match arg.as_ref() {
22 "save" => save = true,
23 "load" => load = true,
24 _ => eprintln!("Ignore invalid argument '{arg}'"),
25 }
26 }
27
28 let Ok(net) = Net::load("examples/example.pn".as_ref()) else {
29 eprintln!("Failed to load example net");
30 return ExitCode::FAILURE;
31 };
32 let mut net = MultiPetriNetSimulation::new(net);
33
34 let mut names = HashMap::new();
35 let Ok(file) = File::open("examples/example.pnk") else {
36 eprintln!("Failed to load example keys");
37 return ExitCode::FAILURE;
38 };
39 for (tid, line) in net.transition_ids().zip(BufReader::new(file).lines()) {
40 let Ok(line) = line else {
41 eprintln!("Failed to read key");
42 return ExitCode::FAILURE;
43 };
44 names.insert(tid, line);
45 }
46
47 if save && net.save("examples/example_copy.pns".as_ref()).is_err() {
48 eprintln!("Failed to save example net");
49 }
50
51 if load {
52 fn read_values(filename: &Path) -> std::io::Result<Vec<u32>> {
53 let size = (std::fs::metadata(filename)?.len() + 3) / 4;
54
55 let mut file = File::open(filename)?;
56
57 (0..size)
58 .map(|_| {
59 let mut value = [0; 4];
60 file.read_exact(&mut value)?;
61 Ok(u32::from_le_bytes(value))
62 })
63 .collect()
64 }
65
66 let Ok(data) = read_values("examples/example.pns".as_ref()) else {
67 eprintln!("Reading state data failed");
68 return ExitCode::FAILURE;
69 };
70
71 if net.add_simulation_from_data(data).is_err() {
72 eprintln!("State initialization failed");
73 return ExitCode::FAILURE;
74 }
75 } else {
76 net.add_simulation();
77 }
78
79 enum StepAction {
80 Continue,
81 Reverse,
82 Save,
83 Quit,
84 }
85
86 let mut forward = true;
87 for mut simulation in &mut net {
88 fn step<D: PlayDirection>(
89 fire: CallState<PetriNetSimulationBorrowMut, D>,
90 names: &HashMap<Tid, String>,
91 ) -> StepAction {
92 if fire.callables.is_empty() {
93 return StepAction::Reverse;
94 }
95
96 for (i, tid) in fire.callables.iter().enumerate() {
97 println!("{}: {}", i + 1, names[tid]);
98 }
99 let stdin = io::stdin();
100 let mut string = String::new();
101 let Ok(size) = stdin.read_line(&mut string) else {
102 eprintln!("Input error");
103 return StepAction::Continue;
104 };
105 if size == 0 {
106 return StepAction::Continue;
107 }
108 match unsafe { string.chars().next().unwrap_unchecked() } {
109 'r' => return StepAction::Reverse,
110 'q' => return StepAction::Quit,
111 's' => return StepAction::Save,
112 _ => (),
113 }
114 match usize::from_str(&string[..(string.len() - 1)]) {
115 Ok(num) if num != 0 && num <= fire.callables.len() => {
116 fire.call(num - 1);
117 }
118 _ => {
119 println!(
120 "You have to input a valid number from 1 to {}",
121 fire.callables.len()
122 );
123 println!("You can also quit by writing \"q\", save the current state by writing \"s\" or reverse by writing \"r\"");
124 return StepAction::Continue;
125 }
126 }
127
128 StepAction::Continue
129 }
130
131 loop {
132 let step_action = if forward {
133 step(simulation.prepare_call(), &names)
134 } else {
135 step(simulation.prepare_revert(), &names)
136 };
137
138 use StepAction::*;
139 match step_action {
140 Continue => (),
141 Reverse => {
142 println!("Reverse play direction!");
143 forward = !forward;
144 }
145 Save => {
146 fn save(data: &[usize], filename: &Path) -> std::io::Result<()> {
147 let mut file = File::create(filename)?;
148 for &count in data {
149 file.write_all(&(count as u32).to_le_bytes())?;
150 }
151
152 Ok(())
153 }
154
155 let data = simulation.data();
156
157 println!(
158 "{}",
159 if save(data, "examples/example.pns".as_ref()).is_ok() {
160 "Saving successful"
161 } else {
162 "Saving failed"
163 }
164 );
165 }
166 Quit => break,
167 }
168 }
169 }
170
171 ExitCode::SUCCESS
172}
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.
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.
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.
Sourcepub fn remove_transition(&mut self, tid: Id<Transition>)
pub fn remove_transition(&mut self, tid: Id<Transition>)
Remove a transition at index tid
from petri net.
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
.
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
.
Result represents success.
Sourcepub fn disconnect_place_to_transition(
&mut self,
pid: Id<Place>,
tid: Id<Transition>,
)
pub fn disconnect_place_to_transition( &mut self, pid: Id<Place>, tid: Id<Transition>, )
Remove the connection in to transition with index tid
from place with index pid
.
Sourcepub fn disconnect_transition_to_place(
&mut self,
tid: Id<Transition>,
pid: Id<Place>,
)
pub fn disconnect_transition_to_place( &mut self, tid: Id<Transition>, pid: Id<Place>, )
Remove the connection out from transition with index tid
to place with index pid
.
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
.
Sourcepub fn add_connected_place(
&mut self,
in_tids: &[Id<Transition>],
out_tids: &[Id<Transition>],
) -> Id<Place>
pub fn add_connected_place( &mut self, in_tids: &[Id<Transition>], out_tids: &[Id<Transition>], ) -> Id<Place>
Add a new place to the petri net, connct it to the specified transitions and get the index.
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.
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.
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.
Trait Implementations§
Source§impl Deref for PetriNetInfo
impl Deref for PetriNetInfo
Source§impl DerefMut for PetriNetInfo
impl DerefMut for PetriNetInfo
Source§impl EditableSimulationInfo for PetriNetInfo
impl EditableSimulationInfo for PetriNetInfo
Source§unsafe fn edit(&mut self) -> EditNet<'_>
unsafe fn edit(&mut self) -> EditNet<'_>
Source§unsafe fn refresh_state(&self, state: &mut Self::State)
unsafe fn refresh_state(&self, state: &mut Self::State)
state
, assuming it is compatible with this SimulationInfo
instance. Read moreSource§impl From<Net> for PetriNetInfo
impl From<Net> for PetriNetInfo
Source§impl From<PetriNetInfo> for Net
impl From<PetriNetInfo> for Net
Source§fn from(val: PetriNetInfo) -> Self
fn from(val: PetriNetInfo) -> Self
Source§impl SimulationInfo for PetriNetInfo
impl SimulationInfo for PetriNetInfo
Source§type StateLoadingError = StateInitializationError
type StateLoadingError = StateInitializationError
Source§type AccessData = [usize]
type AccessData = [usize]
Source§type Event = Id<Transition>
type Event = Id<Transition>
Source§type EventContainer<'a> = TransitionView<'a>
type EventContainer<'a> = TransitionView<'a>
Source§fn default_state(&self) -> State
fn default_state(&self) -> State
SimulationInfo
instance.Source§fn load_state(&self, data: Vec<u32>) -> Result<State, StateInitializationError>
fn load_state(&self, data: Vec<u32>) -> Result<State, StateInitializationError>
Result
with the loaded state or an error.Source§unsafe fn clone_state(&self, state: &State) -> State
unsafe fn clone_state(&self, state: &State) -> State
Source§unsafe fn data<'a>(&self, state: &'a State) -> &'a [usize]
unsafe fn data<'a>(&self, state: &'a State) -> &'a [usize]
state
. Read moreSource§fn callables(state: &State) -> TransitionView<'_>
fn callables(state: &State) -> TransitionView<'_>
state
.Source§fn callable(state: &State, tid: Tid) -> bool
fn callable(state: &State, tid: Tid) -> bool
event
can be called for the given state
.Source§fn revertables(state: &State) -> TransitionView<'_>
fn revertables(state: &State) -> TransitionView<'_>
state
.