Added example Markov
Example Markov : simulation of a Markov chain. Use of a Random module, external call to C rand() function.
This commit is contained in:
		
							parent
							
								
									61f043856a
								
							
						
					
					
						commit
						d5ee87b7ed
					
				
					 8 changed files with 98 additions and 0 deletions
				
			
		
							
								
								
									
										21
									
								
								examples/random/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								examples/random/README
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| Simple Markov chain simulation by external call to random() C function : | ||||
| 
 | ||||
| - random.epi : Heptagon interface containing the declaration of | ||||
|   random() function | ||||
| 
 | ||||
| - random.h, random.c : "glue" between actual random() C function and | ||||
|   function calls generated by Heptagon | ||||
| 
 | ||||
| - markov.ept : contains node "process", simulating a two-state Markov | ||||
|   chain, with probability p (constant) at each step to go from one | ||||
|   state to the other | ||||
| 
 | ||||
| Function "random" and node "process" are declared unsafe to avoid | ||||
| optimization removing calls to "random" ("random" has side effects). | ||||
| 
 | ||||
| Compilation and simulation : | ||||
| 
 | ||||
| heptc random.epi | ||||
| heptc -target c -s process -hepts markov.ept | ||||
| gcc -I . -I markov_c -I /usr/local/lib/heptagon/c random.c markov_c/_main.c markov_c/markov.c markov_c/markov_types.c -o markov | ||||
| hepts -mod Markov -node process -exec ./markov | ||||
							
								
								
									
										20
									
								
								examples/random/markov.ept
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								examples/random/markov.ept
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| open Random | ||||
| 
 | ||||
| const p : float = 0.3 | ||||
| 
 | ||||
| unsafe node process() = (o:bool) | ||||
| let | ||||
|   automaton | ||||
|     state A | ||||
|       var c : bool; | ||||
|       do o = false; c = random() <. p;  | ||||
|       until c then B | ||||
|           | not c then C | ||||
|     state B | ||||
|       var c : bool; | ||||
|       do o = true; c = random() <. p | ||||
|       until c then A | ||||
|     state C | ||||
|       do o = false | ||||
|   end | ||||
| tel | ||||
							
								
								
									
										15
									
								
								examples/random/mathext.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								examples/random/mathext.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include "mathext.h" | ||||
| 
 | ||||
| void Mathext__power_step(float x, int n, Mathext__power_out *o) { | ||||
|   float r; | ||||
|   int i; | ||||
| 
 | ||||
|   r = 1.0; | ||||
|   for (i = 1; i <= n; i++) { | ||||
|     r = r * x; | ||||
|   } | ||||
|   o->y = r; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								examples/random/mathext.epi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								examples/random/mathext.epi
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| 
 | ||||
| (* output : y = x^n *) | ||||
| val fun power(x:float; n:int) = (y:float) | ||||
							
								
								
									
										14
									
								
								examples/random/mathext.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								examples/random/mathext.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| 
 | ||||
| #ifndef MATHEXT_H | ||||
| #define MATHEXT_H | ||||
| 
 | ||||
| 
 | ||||
| /* Example of a combinatorial function */ | ||||
| typedef struct Mathext__power_out { | ||||
|   float y; | ||||
| } Mathext__power_out; | ||||
| 
 | ||||
| void Mathext__power_step(float x, int n, Mathext__power_out *o); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										8
									
								
								examples/random/random.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								examples/random/random.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include "random.h" | ||||
| 
 | ||||
| void Random__random_step(Random__random_out *o) { | ||||
|   o->z = ((double)random())/((double)RAND_MAX); | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								examples/random/random.epi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								examples/random/random.epi
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| 
 | ||||
| (* output : random float in interval [0,1] *) | ||||
| unsafe val fun random() = (z:float) | ||||
							
								
								
									
										14
									
								
								examples/random/random.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								examples/random/random.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| 
 | ||||
| #ifndef RANDOM_H | ||||
| #define RANDOM_H | ||||
| 
 | ||||
| 
 | ||||
| /* Example of a combinatorial function */ | ||||
| typedef struct Random__random_out { | ||||
|   float z; | ||||
| } Random__random_out; | ||||
| 
 | ||||
| void Random__random_step(Random__random_out *o); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
		Loading…
	
		Reference in a new issue
	
	 Gwenaël Delaval
						Gwenaël Delaval