#!/usr/bin/perl -w use strict; use warnings; use List::Util 'shuffle'; my $outputfile = "sim.onsets.csv"; open (OUTPUT, ">" . $outputfile) or die "Can't open output file. $!"; # recall that this is not everything that Trevor said, but rather # what his parents wrote down. It's a sample of what Trevor said. my @speech = qw(clock clock clock clock clock clock clock clock clock clock clock clock clock clock clock hungry hungry hungry clock clock clock hungry cracker cracker blanket blanket blanket cream plane blanket blanket cracker cream plane tree blanket clock clock cracker plane tree tree blanket cleaner cleaner cracker plane tree plane blanket cloud cracker tree tree cleaner cleaner clock cracker cracker crying plane tree tree tree Bruce cracker plane plane blanket cracker plane plane tree cracker cracker clock cracker broom frog clock plane train train blanket frog frog clock cracker plane blanket block frog clock cracker cracker train train train tree blanket blanket blanket broom broom brush frog clock cracker plane train tree broom flower plane blanket block broom flower clip clock cracker tree blanket broom broom flower flower frog clock plane apricot apricot tree blanket block flower flower frog cream blanket blanket blanket blanket block flower frog clock plane please please tree blanket block broom brush children flower frog clock clock plane plant plug train tree truck blanket brush flower frog grass cleaner clock cracker crying plane plant please tree blanket brush frog cleaner cleaner clock cracker plant please tree blanket blanket blow broom flower frog grape grape plane plant throw flower clock blanket Brandt broom brush dress frog cleaner clock crying plane plane plant please pretty pretty Trevor Trevor truck blanket blanket block frog cleaner clock cracker cracker cream crying plane plant please please plug Trevor blanket block brush clock close cracker cracker cream crying plane plane plant please plug apricot tree Trevor Trevor block blow blow dress flower cleaner close cracker cream crying plant please plug blanket broom brush children flower flower clock cracker cream cream cream plant plate please plug plum tree tree Trevor Trevor truck block broom broom brush children clock cloud cream crying please please plug Trevor blanket block broom broom broom brush brush children children flower frog glass grass grass green close close cracker crying plant please plug tree Trevor Trevor truck block brush flower frog clock close cracker crying plane plant please apricot tree Trevor Trevor truck blanket blow brush brush children drawer drink flower glass grape grass green close cream please plug tree Trevor cleaner cleaner glass clock clock cracker plane throw train truck blanket brush children children flush green clock close cracker cracker cream cream cream crying plane plane plant plant plant please plug throw Trevor Trevor cloud crying play please Trevor flower fruit cream play plug apricot Trevor bread fruit cleaner close crying plant tree truck flower fruit green cleaner cloud crying play tree Trevor brush dry laundry flower close crying truck cream cream block block glass close cloud cream crying plane plane plane plane please plug tree truck plug truck truck truck flower green cleaner cleaner plane plane plant pretty throw truck truck blanket blanket block drink flies flower flower frog frog cream cream plane plane pretty blanket blanket broom brush children dry laundry flower glass glass glass grape grape cleaner close cloud cloud cream cream plane plant please please plug plug apricot pretty throw Trevor Trevor truck broken dry laundry frog frog growl close close cracker plane plant play apricot truck blanket breakfast broom brush flush glass hungry close cloud crying crying plane plant please please please plum throw Trevor truck truck blanket broken children frog frog green cleaner clock close close cloud plane please apricot apricot apricot throw train truck flush front front fruit fruit fruit fruit fruit green close cloud plane plant plant play play please please apricot train tree tree tree tree tree tree blanket blow bread broken dress frog hungry hungry cloud plane plant plant plant play throw throw train tree Trevor Trevor Trevor blanket blanket blow bread bread floor from fruit hungry close close cloud plane plane plant plant plant please plug plug apricot throw blanket block block broken broom brush flower from growl hungry hungry hungry cleaner clock close cloud crying plane plant plant plant plant plant plant plant play please please plug train train train Trevor truck truck blanket blanket bridge brush drop flower cleaner close crying plane plant play please plug pretty tree Trevor Trevor plane plane drip drop blanket brush brush drive flower hungry clock clock cloud plant plant play pretty throw throw Trevor Trevor truck bridge brush flower frog frog frog frog frog grass cloud cloud cloud plane please train Trevor from from fruit crying crying truck truck truck truck blanket blanket blanket blow bread bridge drop drop flower from fruit fruit fruit hungry close plane plane plane plane plane please train Trevor truck truck truck blanket blanket blanket Brandt drop crying please tree bread bright brush children flies frog cream cream plane plane plane plant please Trevor Trevor Trevor Trevor Trevor truck truck truck truck truck Brandt bread bread broken drop floor refrigerator refrigerator growl cloud quick quick plane plane plane plane plant plug apricot train Trevor Trevor Trevor Trevor truck truck truck truck truck truck bright drink close play truck truck truck truck truck blow blow dress hungry hungry hungry Christmas pretty train tree Trevor Trevor Trevor blow Brandt bright broken brush children drop front please throw train Trevor truck blanket blow brush drop flopped friend growl close close plane plane play play play pretty throw throw train truck truck blanket blanket blow blow blow blow Brandt breakfast bright drop drop flies friend growl clock cloud Christmas cracker cracker plane plane plane plane plane plant play play play apricot apricot throw tree Trevor Trevor Trevor twinkle branch Brandt breakfast bright broken drink dry floor from from fruit clock clock Christmas plant plant plant plant plant play play play play please pretty tree tree tree truck truck truck blanket blanket bless Brandt breakfast drip drip flower glass grape green crying crying crying quiet plane plant plant plant plate play play play play play please please Trevor Trevor Trevor Trevor Trevor Trevor Trevor between between flush fruit plant please please apricot apricot throw Trevor Trevor blow Trevor throw blues bright brush children dress dress drop floor green close play play play please pretty train train Trevor Trevor Trevor Trevor Trevor truck truck truck truck blanket bright floor play Trevor truck truck truck bread broken dress dress drop drop fruit fruit play play play apricot pretty pretty throw Trevor Trevor truck truck breakfast drop hungry crying plane play play play please please please please Trevor truck truck truck cleaner crab plant play plug pretty train Trevor Trevor Trevor Trevor Trevor Trevor blanket blanket blanket Brandt drink drop hungry climb crab crab cries crying quite plant plant play play please pretty throw Trevor Trevor Trevor Trevor Trevor plant please please Trevor Trevor Trevor truck blanket blow blow bright brush drink drink drums drums cleaner clip clock quite plate play play play play play pretty train tree Trevor Trevor Trevor Trevor Trevor Trevor Trevor truck truck truck broken brush dress drink flute friend from fruit cleaner cleaner close cloud plane plane plate play play plug throw tree Trevor Trevor Trevor Trevor Trevor Trevor truck blanket drive drop drop from grape Christmas crying quite plane play play play train Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor blow problem flower from front grass hungry clip cream crying plant play play Trevor Trevor Trevor Trevor Trevor truck truck frog Trevor broken glass close cream play throw train Trevor Trevor Trevor Trevor Trevor truck truck blanket blanket please train Trevor Trevor Trevor bridge flower from from close cream play throw Trevor Trevor Trevor drip flower front cleaner close tree Trevor everywhere blanket blow bread brown brows drip drums flower flower flute frame from glass glass growl cracker cream plant play play play play apricot train tree Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor truck truck everywhere blanket train train train train Trevor truck truck truck blanket block brows brush dress drive french frisbee front fruit refrigerator cleaner climb cracker plane plane plant play play please please please please throw train tree tree Trevor Trevor Trevor Trevor truck truck truck trunk block blow blow breakfast frame front front growl hungry cleaner close plane play play play please throw train train train train Trevor Trevor Trevor Trevor Trevor truck truck blow flute clock close plane play play play please pretty Trevor Trevor Trevor Trevor truck flopped plane plane plane plane play play throw Trevor Trevor Trevor Trevor Trevor Trevor block bright dry laundry flute front crying throw train Trevor bring fruit close close cream plane plane plane plant please pretty Trevor Trevor Trevor Trevor Trevor truck truck truck truck drop train train Trevor truck ground close crab cream plane play play plug train Trevor blanket dry close close cloud cream crying plane plant pretty throw tree Trevor Trevor Trevor Trevor Trevor Trevor Trevor bring drop floor flush from grass green plant plant plant play train Trevor Trevor Trevor clip plane plant play play plum Trevor Trevor Trevor truck truck Bruce dry play please please plum plum apricot pretty Trevor Trevor truck blanket breakfast bring drip front glass clock clock close plant Trevor Trevor Trevor Trevor truck truck trunk blanket dress fruit grape close close cream play play Trevor Trevor Trevor Trevor truck brush dress drink dry laundry flush friend grape growl cream plane plane plant plant train Trevor Trevor Trevor Trevor blanket bring dry dry french front clip clock crying plane plane play please plum train train train Trevor Trevor Trevor Trevor problem problem please train train train train train train train train truck problem Brandt brush dress drums drums dry laundry play play play pretty Trevor Trevor blanket block blow bright drink drip drop friend glass glass clock clock close close close cream plane plane plate play play please please please plum plum surprise Trevor Trevor Trevor Trevor Brandt brush brush brush brush drive drive drop front front clock close cracker crying plane plant play please please please please train train train train train train train train Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor Trevor block breakfast bring dress flute flute plane play play please please plum plum apricot Trevor Trevor Trevor truck problem breakfast broken brows brush drink drip drop floor flute front clip close cloud cream plane plane plane play play surprise Trevor truck blanket blow breakfast breakfast drink flute fruit cleaner play pretty tree blow broken dress drip frisbee clock clock clock close close plant plant play play play play play play play play play play play please pretty tree Trevor blanket problem breakfast bring broken drawer dress dry dry dry laundry friend from climb close crying crying plane plane plane please train train Trevor Trevor truck truck truck blanket brows drop dry flush clip play Trevor Trevor Trevor Trevor blanket bring broken dress drive drop flopped frisbee front green green climb close close play please plug pretty train blanket blanket bright broken broken dry flower frisbee frisbee from front front close close cream crying quite plate play play play please please please plug pretty pretty pretty surprise throw throw train train truck play problem breakfast bright bring dry dry laundry laundry friend friend front plane play blanket blow problem bring bring broken dress dress drive flies french from cleaner clock cracker plant plant play play play play please please surprise train blanket blanket blow blow problem problem bring bring dress dress drop flower grape grass green green growl cleaner quiet plane plane plane plane plane plane plane plant play please please please please please please please please plug pretty pretty pretty throw throw train train tree Trevor Trevor broken frog close crying plane play please problem bring play please please breakfast bridge drive friend front grass growl clock cloud pretty throw Trevor blanket blanket blanket broken friend friend from from green clock plane play throw throw train train Trevor truck truck broken children drive drive friend from from from from front green climb clock plane play play play please please please plug tree tree breakfast brown drink dry fruit close Christmas plane play tree tree tree Trevor broken front please truck blanket problem problem friend friend from from cracker cracker cream tree truck); # the grammars that the learner will go through my @grammar; $grammar[0] = {ranking =>"*Complex >> Max, Dep", output => "simplified"}; $grammar[1] = {ranking =>"Max, Dep >> *Complex", output => "faithful"}; my $current_grammar = 0; sub grammarOutput { return ${$grammar[$current_grammar]}{output}; } for(my $sim=0; $sim < 20; $sim++) { # how many simulations to run @speech = shuffle(@speech); $current_grammar = 0; my %cache; # store every form the learner said, error or not my %decayRate; # each type's decay rate is stored here for (my $i=0; $i<@speech; $i++) { my $word = $speech[$i]; # make up a random decay rate for any new word unless(exists($decayRate{$word})) { $decayRate{$word} = .99 + rand(.01); } $current_grammar=1 if($i>300); # now add the current form to the Cache if it isn't already there if (!exists($cache{$word})) { $cache{$word} = []; # initialize cache array if empty } my $found = 0; for my $cached (@{$cache{$word}}) { $found =1 if (${$cached}{winner} eq grammarOutput()); } if (!$found) { my $c = {weight => 1, winner => grammarOutput() }; push(@{$cache{$word}}, $c); } # go through the Cache, and decrease the # weights of forms that are at odds with the current grammar for my $cached (keys %cache) { for my $current_cache (@{$cache{$word}}) { if (${$current_cache}{winner} ne grammarOutput() ) { ${$current_cache}{weight} *= $decayRate{$word}; } } # get rid of old errors that will only be chosen 1 out of 20 times #if (${$current_cache}{weight}<.05) { ${$current_cache}{weight}<.05 } } # now decide how to say this word my $production = ""; my $maxNonGrammarWeight = 0; my $totalNonGrammarWeight = 0; for my $cached (@{$cache{$word}}) { if (${$cached}{winner} ne grammarOutput() ) { $totalNonGrammarWeight += ${$cached}{weight}; $maxNonGrammarWeight = ${$cached}{weight} if (${$cached}{weight} > $maxNonGrammarWeight); } } my $cumulProbility = 0; my $rand = rand(1); CACHED: for my $cached (@{$cache{$word}}) { my $prob = 0; if (${$cached}{winner} ne grammarOutput()) { $prob = ${$cached}{weight} * $maxNonGrammarWeight / $totalNonGrammarWeight; } else { $prob = 1-$maxNonGrammarWeight; } my $winner = ${$cached}{winner}; $cumulProbility+= $prob; if ($rand < $cumulProbility) { $production = $winner; last CACHED; } } if ($production eq "") {die "@{$cache{$word}} $word $i $!"}; # sanity check; should never happen # print the current status in an R-legible form print OUTPUT "$sim,$i," . '"'. ${$grammar[$current_grammar]}{ranking} . '"' . ","; print OUTPUT scalar(keys %decayRate) ; print OUTPUT ",$word,$production"; print OUTPUT "\n"; } } close(OUTPUT) or die "Can't close output file. $!";