66 < link data-trunk rel ="rust "/>
77 </ head >
88 < body >
9- < div id ="abrams "> </ div >
10- < div id ="diaz "> </ div >
9+ < div id ="container ">
10+ < select id ="model ">
11+ < option value ="abrams "> Abrams-Strogatz</ option >
12+ < option value ="diaz "> Diaz-Switkes</ option >
13+ </ select >
14+ < div id ="params ">
15+ < div id ="abrams ">
16+ < label for ="x "> x</ label >
17+ < input type ="number " id ="x " min ="1 " max ="10000 " value ="80 " />
18+ < label for ="y "> y</ label >
19+ < input type ="number " id ="y " min ="1 " max ="10000 " value ="20 " />
20+ < label for ="c "> c</ label >
21+ < input type ="number " id ="c " min ="0 " max ="1 " step ="0.01 " value ="0.5 " />
22+ < label for ="a "> a</ label >
23+ < input type ="number " id ="a " min ="0 " max ="10 " step ="0.01 " value ="1.35 " />
24+ < label for ="s "> s</ label >
25+ < input type ="number " id ="s " min ="0 " max ="1 " step ="0.01 " value ="0.33 " />
26+ </ div >
27+ < div id ="diaz " style ="display: none ">
28+ < label for ="x_1 "> x< sub > 1</ sub > </ label >
29+ < input type ="number " id ="x_1 " min ="1 " max ="10000 " value ="33 " />
30+ < label for ="x_2 "> x< sub > 2</ sub > </ label >
31+ < input type ="number " id ="x_2 " min ="1 " max ="10000 " value ="33 " />
32+ < label for ="b "> b</ label >
33+ < input type ="number " id ="b " min ="0 " max ="10000 " value ="34 " />
34+ < label for ="m_1 "> m< sub > 1</ sub > </ label >
35+ < input type ="number " id ="m_1 " min ="0 " max ="1 " step ="0.01 " value ="0.4 " />
36+ < label for ="m_2 "> m< sub > 2</ sub > </ label >
37+ < input type ="number " id ="m_2 " min ="0 " max ="1 " step ="0.01 " value ="0.6 " />
38+ < label for ="g_1 "> g< sub > 1</ sub > </ label >
39+ < input type ="number " id ="g_1 " min ="0 " max ="1 " step ="0.01 " value ="0.6 " />
40+ < label for ="g_2 "> g< sub > 2</ sub > </ label >
41+ < input type ="number " id ="g_2 " min ="0 " max ="1 " step ="0.01 " value ="0.01 " />
42+ < label for ="alpha "> α</ label >
43+ < input type ="number " id ="alpha " min ="0 " max ="1 " step ="0.01 " value ="0.01 " />
44+ < label for ="beta "> β</ label >
45+ < input type ="number " id ="beta " min ="0 " max ="1 " step ="0.01 " value ="0.2 " />
46+ </ div >
47+ < label for ="t "> t</ label >
48+ < input type ="number " id ="t " min ="1 " max ="1000 " value ="100 " />
49+ < button id ="solve "> Solve</ button >
50+ </ div >
51+ < div id ="plot "> </ div >
52+ </ div >
1153
1254 < script type ="module ">
1355 import "https://cdn.plot.ly/plotly-3.1.0-rc.0.min.js"
1456
1557 let { solve_abrams_strogatz, solve_diaz_switkes } = wasmBindings ;
1658
17- async function run ( ) {
18- Plotly . newPlot ( 'abrams' , [
19- {
20- "y" : solve_abrams_strogatz ( 80 , 20 , 0.2 , 1.31 , 0.33 , 200 ) ,
21- "name" : "Monolingual 1" ,
22- "line" : {
23- "color" : "red"
24- }
59+ const model = document . getElementById ( "model" ) . value ;
60+ document . getElementById ( "abrams" ) . style . display = model === "abrams" ? "block" : "none" ;
61+ document . getElementById ( "diaz" ) . style . display = model === "diaz" ? "block" : "none" ;
62+
63+ document . getElementById ( "model" ) . addEventListener ( "change" , ( e ) => {
64+ const model = e . target . value ;
65+ document . getElementById ( "abrams" ) . style . display = model === "abrams" ? "block" : "none" ;
66+ document . getElementById ( "diaz" ) . style . display = model === "diaz" ? "block" : "none" ;
67+ } ) ;
68+
69+ document . getElementById ( "solve" ) . addEventListener ( "click" , async ( e ) => {
70+ const model = document . getElementById ( "model" ) . value ;
71+ const params = {
72+ abrams : {
73+ x : Number ( document . getElementById ( "x" ) . value ) ,
74+ y : Number ( document . getElementById ( "y" ) . value ) ,
75+ c : Number ( document . getElementById ( "c" ) . value ) ,
76+ a : Number ( document . getElementById ( "a" ) . value ) ,
77+ s : Number ( document . getElementById ( "s" ) . value )
2578 } ,
26- {
27- "y" : solve_abrams_strogatz ( 80 , 20 , 0.2 , 1.31 , 0.33 , 200 ) . map ( y => 100 - y ) ,
28- "name" : "Monolingual 2" ,
29- "line" : {
30- "color" : "blue"
31- }
79+ diaz : {
80+ x_1 : Number ( document . getElementById ( "x_1" ) . value ) ,
81+ x_2 : Number ( document . getElementById ( "x_2" ) . value ) ,
82+ b : Number ( document . getElementById ( "b" ) . value ) ,
83+ m_1 : Number ( document . getElementById ( "m_1" ) . value ) ,
84+ m_2 : Number ( document . getElementById ( "m_2" ) . value ) ,
85+ g_1 : Number ( document . getElementById ( "g_1" ) . value ) ,
86+ g_2 : Number ( document . getElementById ( "g_2" ) . value ) ,
87+ alpha : Number ( document . getElementById ( "alpha" ) . value ) ,
88+ beta : Number ( document . getElementById ( "beta" ) . value )
3289 }
33- ] ) ;
90+ } [ model ] ;
91+ const t = document . getElementById ( "t" ) . value ;
92+
93+ if ( model === "abrams" ) {
94+ const solution = await solve_abrams_strogatz ( params . x , params . y , params . c , params . a , params . s , t ) ;
95+ plot ( [ solution , solution . map ( y => ( params . x + params . y ) - y ) ] ) ;
96+ } else {
97+ const x = await solve_diaz_switkes ( [ params . x_1 , params . x_2 , params . b ] , [ params . m_1 , params . m_2 ] , [ params . g_1 , params . g_2 ] , params . alpha , params . beta , t , 0 ) ;
98+ const b = await solve_diaz_switkes ( [ params . x_1 , params . x_2 , params . b ] , [ params . m_1 , params . m_2 ] , [ params . g_1 , params . g_2 ] , params . alpha , params . beta , t , 1 ) ;
99+ plot ( [ x , b , x . map ( ( y , i ) => ( params . x_1 + params . x_2 + params . b ) - ( y + b [ i ] ) ) ] ) ;
100+ }
101+ } ) ;
34102
35- Plotly . newPlot ( 'diaz' , [
36- {
37- "y" : solve_diaz_switkes (
38- [ 33 , 34 , 33 ] , [ 0.4 , 0.6 ] , [ 0.6 , 0.01 ] , 0.01 , 0.2 , 300 , 0
39- ) ,
40- "name" : "Monolingual 1" ,
41- "line" : {
42- "color" : "red"
43- }
44- } ,
45- {
46- "y" : solve_diaz_switkes (
47- [ 33 , 34 , 33 ] , [ 0.4 , 0.6 ] , [ 0.6 , 0.01 ] , 0.01 , 0.2 , 300 , 1
48- ) ,
49- "name" : "Bilingual" ,
50- "line" : {
51- "color" : "blue"
52- }
103+ function plot ( data ) {
104+ Plotly . purge ( "plot" ) ;
105+ let input = [ ] ;
106+ for ( let i = 0 ; i < data [ 0 ] . length ; i ++ ) {
107+ input . push ( { y : data [ i ] } ) ;
108+ }
109+
110+ const layout = {
111+ title : "Lang Shift" ,
112+ xaxis : {
113+ title : "Time"
53114 } ,
54- {
55- "y" : solve_diaz_switkes (
56- [ 33 , 34 , 33 ] , [ 0.4 , 0.6 ] , [ 0.6 , 0.01 ] , 0.01 , 0.2 , 300 , 2
57- ) ,
58- "name" : "Monolingual 2" ,
59- "line" : {
60- "color" : "green"
61- }
115+ yaxis : {
116+ title : "Population"
62117 }
63- ] ) ;
64- }
118+ } ;
65119
66- run ( ) ;
120+ Plotly . newPlot ( "plot" , input , layout ) ;
121+ }
67122 </ script >
68123 </ body >
69124</ html >
0 commit comments